core/crm-core/internal/config/config.go
2025-12-27 14:32:00 -03:00

74 lines
1.4 KiB
Go

package config
import (
"errors"
"fmt"
"os"
"strconv"
"time"
)
type Config struct {
Env string
HTTPAddr string
DatabaseURL string
JWKSURL string
RequestTimeout time.Duration
ShutdownTimeout time.Duration
}
func Load() (Config, error) {
cfg := Config{
Env: getenv("APP_ENV", "development"),
HTTPAddr: getenv("HTTP_ADDR", ":8080"),
DatabaseURL: os.Getenv("DATABASE_URL"),
JWKSURL: os.Getenv("JWKS_URL"),
RequestTimeout: getDuration("REQUEST_TIMEOUT", 10*time.Second),
ShutdownTimeout: getDuration("SHUTDOWN_TIMEOUT", 10*time.Second),
}
if cfg.DatabaseURL == "" {
return Config{}, errors.New("DATABASE_URL is required")
}
if cfg.JWKSURL == "" {
return Config{}, errors.New("JWKS_URL is required")
}
return cfg, nil
}
func getenv(key, fallback string) string {
if val := os.Getenv(key); val != "" {
return val
}
return fallback
}
func getDuration(key string, fallback time.Duration) time.Duration {
if val := os.Getenv(key); val != "" {
parsed, err := time.ParseDuration(val)
if err == nil {
return parsed
}
}
return fallback
}
func MustLoad() Config {
cfg, err := Load()
if err != nil {
panic(fmt.Errorf("config load failed: %w", err))
}
return cfg
}
func GetBool(key string, fallback bool) bool {
val := os.Getenv(key)
if val == "" {
return fallback
}
parsed, err := strconv.ParseBool(val)
if err != nil {
return fallback
}
return parsed
}