logging and client, context utils
This commit is contained in:
@ -1,42 +0,0 @@
|
||||
package list
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
eiaapi "gitea.libretechconsulting.com/50W/eia-api-go/api"
|
||||
)
|
||||
|
||||
var ListCmd = &cobra.Command{
|
||||
Use: "list <name>",
|
||||
Args: cobra.RangeArgs(0, 1),
|
||||
Short: "List Available EIA Series",
|
||||
Run: runListCmd,
|
||||
}
|
||||
|
||||
func runListCmd(cmd *cobra.Command, _ []string) {
|
||||
client, err := eiaapi.NewClient("https://api.eia.gov")
|
||||
if err != nil {
|
||||
fmt.Println(err.Error())
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
resp, err := client.GetV2(cmd.Context())
|
||||
if err != nil {
|
||||
fmt.Println(err.Error())
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
defer resp.Body.Close()
|
||||
response := make([]byte, 0)
|
||||
|
||||
_, err = resp.Body.Read(response)
|
||||
if err != nil {
|
||||
fmt.Println(err.Error())
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
fmt.Printf("%s\n", response)
|
||||
}
|
32
cmd/eia-client/cmd/list/list_series.go
Normal file
32
cmd/eia-client/cmd/list/list_series.go
Normal file
@ -0,0 +1,32 @@
|
||||
package list
|
||||
|
||||
import (
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
"gitea.libretechconsulting.com/50W/eia-api-go/cmd/eia-client/internal/util"
|
||||
)
|
||||
|
||||
var ListCmd = &cobra.Command{
|
||||
Use: "list <name>",
|
||||
Args: cobra.RangeArgs(0, 1),
|
||||
Short: "List Available EIA Series",
|
||||
PreRun: util.SetClient,
|
||||
Run: runListCmd,
|
||||
}
|
||||
|
||||
func runListCmd(cmd *cobra.Command, _ []string) {
|
||||
logger := util.Logger(cmd)
|
||||
client, err := util.Client(cmd)
|
||||
if err != nil {
|
||||
logger.Fatal().Err(err).Send()
|
||||
}
|
||||
|
||||
ctx, cncl := util.RequestCtx(cmd)
|
||||
defer cncl()
|
||||
resp, err := client.GetV2(ctx)
|
||||
if err != nil {
|
||||
logger.Err(err).Send()
|
||||
}
|
||||
|
||||
logger.Debug().Any("resp", resp).Send()
|
||||
}
|
@ -25,15 +25,32 @@ import (
|
||||
"context"
|
||||
"os"
|
||||
"os/signal"
|
||||
"time"
|
||||
|
||||
"gitea.libretechconsulting.com/50W/eia-api-go/cmd/client/cmd/list"
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
"gitea.libretechconsulting.com/50W/eia-api-go/cmd/eia-client/cmd/list"
|
||||
"gitea.libretechconsulting.com/50W/eia-api-go/cmd/eia-client/internal/util"
|
||||
)
|
||||
|
||||
// rootCmd represents the base command when called without any subcommands
|
||||
var rootCmd = &cobra.Command{
|
||||
Use: "eia-client",
|
||||
Short: "Useful utilities for EIA API v2",
|
||||
Use: "eia-client",
|
||||
Short: "Useful utilities for EIA API v2",
|
||||
PersistentPreRun: PreRun,
|
||||
}
|
||||
|
||||
func PreRun(cmd *cobra.Command, _ []string) {
|
||||
// Set up logging
|
||||
console := zerolog.ConsoleWriter{
|
||||
Out: os.Stdout,
|
||||
TimeFormat: time.RFC1123,
|
||||
}
|
||||
logger := zerolog.New(console).With().
|
||||
Timestamp().Logger().Level(*util.GetLogLevel(cmd))
|
||||
|
||||
util.SetLogger(cmd, &logger)
|
||||
}
|
||||
|
||||
// Execute adds all child commands to the root command and sets flags appropriately.
|
||||
@ -49,15 +66,21 @@ func Execute() {
|
||||
}
|
||||
|
||||
func init() {
|
||||
// Here you will define your flags and configuration settings.
|
||||
// Cobra supports persistent flags, which, if defined here,
|
||||
// will be global for your application.
|
||||
// Enable PreRun for all commands
|
||||
cobra.EnableTraverseRunHooks = true
|
||||
|
||||
// rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cmd.yaml)")
|
||||
// Handle command flags
|
||||
rootCmd.PersistentFlags().StringP(util.FLAG_LOG_LEVEL, "l", util.DefaultLogLevel.String(),
|
||||
"Log Level, or set "+util.ENV_LOG_LEVEL+" in environment")
|
||||
|
||||
// Cobra also supports local flags, which will only run
|
||||
// when this action is called directly.
|
||||
rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
|
||||
rootCmd.PersistentFlags().StringP(util.FLAG_API_LOG_LEVEL, "L", util.DefAPILogLevel.String(),
|
||||
"Log Level for EIA API Middleware, or set "+util.ENV_API_LOG_LEVEL+" in environment")
|
||||
|
||||
rootCmd.PersistentFlags().StringP(util.FLAG_APIKEY,
|
||||
"a", "", "API Key, or set "+util.ENV_API+" in environment")
|
||||
|
||||
rootCmd.PersistentFlags().DurationP(util.FLAG_TMOUT, "t", util.DefRequestTimeout,
|
||||
"Request timeout, or set "+util.ENV_TMOUT+" in environment")
|
||||
|
||||
// Subcommands
|
||||
rootCmd.AddCommand(list.ListCmd)
|
28
cmd/eia-client/internal/util/util.go
Normal file
28
cmd/eia-client/internal/util/util.go
Normal file
@ -0,0 +1,28 @@
|
||||
package util
|
||||
|
||||
// These constants contain typed values
|
||||
// for safely setting and retrieving flags
|
||||
// from the cobra command
|
||||
const (
|
||||
FLAG_APIKEY = "apiKey"
|
||||
ENV_API = "EIA_API_KEY"
|
||||
|
||||
FLAG_TMOUT = "timeout"
|
||||
ENV_TMOUT = "EIA_API_TMOUT"
|
||||
|
||||
FLAG_API_LOG_LEVEL = "apiLogLevel"
|
||||
ENV_API_LOG_LEVEL = "EIA_API_LOG_LEVEL"
|
||||
|
||||
FLAG_LOG_LEVEL = "logLevel"
|
||||
ENV_LOG_LEVEL = "LOG_LEVEL"
|
||||
)
|
||||
|
||||
// Type for context data
|
||||
type eiaCtxField uint8
|
||||
|
||||
// These constants contain fields to safely set
|
||||
// or get fields from the command context
|
||||
const (
|
||||
CTX_EIA_CLIENT eiaCtxField = iota
|
||||
CTX_EIA_TMOUT
|
||||
)
|
67
cmd/eia-client/internal/util/util_api.go
Normal file
67
cmd/eia-client/internal/util/util_api.go
Normal file
@ -0,0 +1,67 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
"gitea.libretechconsulting.com/50W/eia-api-go/pkg/eia"
|
||||
)
|
||||
|
||||
var (
|
||||
DefRequestTimeout = 5 * time.Second
|
||||
DefAPILogLevel = zerolog.DebugLevel
|
||||
)
|
||||
|
||||
func RequestCtx(cmd *cobra.Command) (context.Context, context.CancelFunc) {
|
||||
return context.WithTimeout(cmd.Context(), GetRequestTmout(cmd))
|
||||
}
|
||||
|
||||
func GetRequestTmout(cmd *cobra.Command) time.Duration {
|
||||
tmout, ok := cmd.Context().Value(CTX_EIA_TMOUT).(time.Duration)
|
||||
if !ok || tmout == 0 {
|
||||
return DefRequestTimeout
|
||||
}
|
||||
return tmout
|
||||
}
|
||||
|
||||
func SetRequestTmout(cmd *cobra.Command, tmout time.Duration) {
|
||||
cmd.SetContext(context.WithValue(cmd.Context(),
|
||||
CTX_EIA_TMOUT, tmout))
|
||||
}
|
||||
|
||||
func Client(cmd *cobra.Command) (*eia.Client, error) {
|
||||
client, ok := cmd.Context().Value(CTX_EIA_CLIENT).(*eia.Client)
|
||||
if !ok {
|
||||
return nil, errors.New("command context lacks api client")
|
||||
}
|
||||
return client, nil
|
||||
}
|
||||
|
||||
func SetClient(cmd *cobra.Command, _ []string) {
|
||||
client, err := eia.NewClient(&eia.ClientOpts{
|
||||
Context: cmd.Context(),
|
||||
APIKey: GetAPIKey(cmd),
|
||||
Logger: Logger(cmd),
|
||||
LogLevel: GetAPILogLevel(cmd),
|
||||
})
|
||||
if err != nil {
|
||||
Logger(cmd).Fatal().Err(err).Send()
|
||||
}
|
||||
|
||||
cmd.SetContext(context.WithValue(cmd.Context(),
|
||||
CTX_EIA_CLIENT, client))
|
||||
}
|
||||
|
||||
func GetAPIKey(cmd *cobra.Command) string {
|
||||
if key := os.Getenv(ENV_API); key != "" {
|
||||
return key
|
||||
}
|
||||
|
||||
key, _ := cmd.Flags().GetString(FLAG_APIKEY)
|
||||
return key
|
||||
}
|
74
cmd/eia-client/internal/util/util_logging.go
Normal file
74
cmd/eia-client/internal/util/util_logging.go
Normal file
@ -0,0 +1,74 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var DefaultLogLevel = zerolog.InfoLevel
|
||||
|
||||
func Logger(cmd *cobra.Command) *zerolog.Logger {
|
||||
return zerolog.Ctx(cmd.Context())
|
||||
}
|
||||
|
||||
func SetLogger(cmd *cobra.Command, logger *zerolog.Logger) {
|
||||
cmd.SetContext(logger.WithContext(cmd.Context()))
|
||||
}
|
||||
|
||||
func GetLogLevel(cmd *cobra.Command) *zerolog.Level {
|
||||
var level zerolog.Level
|
||||
var err error
|
||||
if envLevel := os.Getenv(ENV_LOG_LEVEL); envLevel != "" {
|
||||
level, err = zerolog.ParseLevel(envLevel)
|
||||
if err != nil {
|
||||
Logger(cmd).Err(err).
|
||||
Str("envLogLevel", envLevel).
|
||||
Str("envVar", ENV_LOG_LEVEL).
|
||||
Str("defaultLevel", DefaultLogLevel.String()).
|
||||
Msg("Invalid log level in environment, using default")
|
||||
level = DefaultLogLevel
|
||||
}
|
||||
}
|
||||
|
||||
if flagLevel, err := cmd.Flags().GetString(FLAG_LOG_LEVEL); err == nil {
|
||||
level, err = zerolog.ParseLevel(flagLevel)
|
||||
if err != nil {
|
||||
Logger(cmd).Err(err).
|
||||
Str("flagLogLevel", flagLevel).
|
||||
Str("defaultLevel", DefaultLogLevel.String()).
|
||||
Msg("Invalid log level in command flag, using default")
|
||||
level = DefaultLogLevel
|
||||
}
|
||||
}
|
||||
return &level
|
||||
}
|
||||
|
||||
func GetAPILogLevel(cmd *cobra.Command) *zerolog.Level {
|
||||
var level zerolog.Level
|
||||
var err error
|
||||
if envLevel := os.Getenv(ENV_API_LOG_LEVEL); envLevel != "" {
|
||||
level, err = zerolog.ParseLevel(envLevel)
|
||||
if err != nil {
|
||||
Logger(cmd).Err(err).
|
||||
Str("envLogLevel", envLevel).
|
||||
Str("envVar", ENV_API_LOG_LEVEL).
|
||||
Str("defaultLevel", DefAPILogLevel.String()).
|
||||
Msg("Invalid API log level in environment, using default")
|
||||
level = DefAPILogLevel
|
||||
}
|
||||
}
|
||||
|
||||
if flagLevel, err := cmd.Flags().GetString(FLAG_API_LOG_LEVEL); err == nil {
|
||||
level, err = zerolog.ParseLevel(flagLevel)
|
||||
if err != nil {
|
||||
Logger(cmd).Err(err).
|
||||
Str("flagLogLevel", flagLevel).
|
||||
Str("defaultLevel", DefAPILogLevel.String()).
|
||||
Msg("Invalid API log level in command flag, using default")
|
||||
level = DefAPILogLevel
|
||||
}
|
||||
}
|
||||
return &level
|
||||
}
|
@ -21,7 +21,7 @@ THE SOFTWARE.
|
||||
*/
|
||||
package main
|
||||
|
||||
import "gitea.libretechconsulting.com/50W/eia-api-go/cmd/client/cmd"
|
||||
import "gitea.libretechconsulting.com/50W/eia-api-go/cmd/eia-client/cmd"
|
||||
|
||||
func main() {
|
||||
cmd.Execute()
|
Reference in New Issue
Block a user