74 lines
1.4 KiB
Go
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
|
|
}
|