refactor: Replace switch statement with map-based config parsing

This commit is contained in:
2024-11-11 14:56:41 +02:00
parent 6bcc7081b2
commit bea0d22c26

View File

@@ -8,83 +8,105 @@ import (
"github.com/rs/zerolog" "github.com/rs/zerolog"
) )
// Environment variable names
const (
EnvLogLevel = "LOG_LEVEL"
EnvRootPath = "ROOT_PATH"
EnvNumWorkers = "NUM_OF_WORKERS"
EnvWorkerBatchSize = "WORKER_BATCH_SIZE"
EnvMaxResponseSize = "MAX_RESPONSE_SIZE"
EnvResponseTimeout = "RESPONSE_TIMEOUT"
)
// Config holds the application configuration loaded from environment variables
type Config struct { type Config struct {
LogLevel zerolog.Level LogLevel zerolog.Level // Logging level (debug, info, warn, error)
rootPath string RootPath string // Root path for the application
MaxResponseSize int MaxResponseSize int // Maximum size of response in bytes
NumOfWorkers int NumOfWorkers int // Number of concurrent workers
ResponseTimeout int ResponseTimeout int // Timeout for responses in seconds
WorkerBatchSize int WorkerBatchSize int // Batch size for worker processing
} }
var CONFIG Config var CONFIG Config
func GetConfig() *Config { // parsePositiveInt parses and validates positive integer values
var config Config func parsePositiveInt(value string) (int, error) {
for _, envVar := range []string{ val, err := strconv.Atoi(value)
"LOG_LEVEL",
"ROOT_PATH",
"NUM_OF_WORKERS",
"WORKER_BATCH_SIZE",
"MAX_RESPONSE_SIZE",
"RESPONSE_TIMEOUT",
} {
if env, ok := os.LookupEnv(envVar); !ok {
fmt.Fprintf(os.Stderr, "Missing env var %s\n", envVar)
os.Exit(1)
} else {
switch envVar {
case "LOG_LEVEL":
{
logLevel, err := zerolog.ParseLevel(env)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "Invalid LOG_LEVEL value\n") return 0, err
os.Exit(1)
} }
config.LogLevel = logLevel if val <= 0 {
return 0, fmt.Errorf("value must be positive")
} }
case "ROOT_PATH": return val, nil
{
config.rootPath = env
} }
case "NUM_OF_WORKERS":
{ // GetConfig loads and validates configuration from environment variables
if numOfWorkers, err := strconv.Atoi(env); err != nil { func GetConfig() *Config {
fmt.Fprintf(os.Stderr, "Invalid NUM_OF_WORKERS value\n") config := &Config{}
os.Exit(1)
} else { // Map of environment variables to their parsing functions
config.NumOfWorkers = numOfWorkers parsers := map[string]func(string) error{
EnvLogLevel: func(v string) error {
level, err := zerolog.ParseLevel(v)
if err != nil {
return fmt.Errorf("invalid log level: %w", err)
} }
config.LogLevel = level
return nil
},
EnvRootPath: func(v string) error {
config.RootPath = v
return nil
},
EnvNumWorkers: func(v string) error {
val, err := parsePositiveInt(v)
if err != nil {
return fmt.Errorf("invalid number of workers: %w", err)
} }
case "WORKER_BATCH_SIZE": config.NumOfWorkers = val
{ return nil
if workerBatchSize, err := strconv.Atoi(env); err != nil { },
fmt.Fprintf(os.Stderr, "Invalid WORKER_BATCH_SIZE value\n") EnvWorkerBatchSize: func(v string) error {
os.Exit(1) val, err := parsePositiveInt(v)
} else { if err != nil {
config.WorkerBatchSize = workerBatchSize return fmt.Errorf("invalid worker batch size: %w", err)
} }
config.WorkerBatchSize = val
return nil
},
EnvMaxResponseSize: func(v string) error {
val, err := parsePositiveInt(v)
if err != nil {
return fmt.Errorf("invalid max response size: %w", err)
} }
case "MAX_RESPONSE_SIZE": config.MaxResponseSize = val
{ return nil
if maxResponseSize, err := strconv.Atoi(env); err != nil { },
fmt.Fprintf(os.Stderr, "Invalid MAX_RESPONSE_SIZE value\n") EnvResponseTimeout: func(v string) error {
os.Exit(1) val, err := parsePositiveInt(v)
} else { if err != nil {
config.MaxResponseSize = maxResponseSize return fmt.Errorf("invalid response timeout: %w", err)
} }
}
case "RESPONSE_TIMEOUT":
{
if val, err := strconv.Atoi(env); err != nil {
fmt.Fprintf(os.Stderr, "Invalid RESPONSE_TIMEOUT value\n")
os.Exit(1)
} else {
config.ResponseTimeout = val config.ResponseTimeout = val
return nil
},
}
// Process each environment variable
for envVar, parser := range parsers {
value, ok := os.LookupEnv(envVar)
if !ok {
fmt.Fprintf(os.Stderr, "Missing required environment variable: %s\n", envVar)
os.Exit(1)
}
if err := parser(value); err != nil {
fmt.Fprintf(os.Stderr, "Configuration error: %v\n", err)
os.Exit(1)
} }
} }
}
} return config
}
return &config
} }