logging and client, context utils
This commit is contained in:
		
							
								
								
									
										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
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user