package main import ( "fmt" "os" "strconv" "strings" "gardomatic.kleiax.de/internal/mailer" ) type config struct { dsn string environment string webBaseURL string demoResetEnabled bool json bool yes bool mail mailer.Config } func configFromEnvironment() (config, error) { port, err := envInt("GARDOMATIC_SMTP_PORT", 25) if err != nil { return config{}, err } demoResetEnabled, err := envBool("GARDOMATIC_DEMO_RESET_ENABLED", false) if err != nil { return config{}, err } return config{ dsn: os.Getenv("GARDOMATIC_DB_DSN"), environment: envString("GARDOMATIC_ENV", "development"), webBaseURL: envString("GARDOMATIC_WEB_BASE_URL", "http://localhost:4040"), demoResetEnabled: demoResetEnabled, mail: mailer.Config{ Mode: mailer.Mode(envString("GARDOMATIC_SMTP_MODE", string(mailer.ModeFile))), Host: os.Getenv("GARDOMATIC_SMTP_HOST"), Port: port, Username: os.Getenv("GARDOMATIC_SMTP_USERNAME"), Password: os.Getenv("GARDOMATIC_SMTP_PASSWORD"), Sender: envString("GARDOMATIC_SMTP_SENDER", "gardomatic@localhost"), FilePath: envString("GARDOMATIC_SMTP_FILE_PATH", "/tmp/gardomatic-mails.log"), }, }, nil } func envBool(name string, fallback bool) (bool, error) { value := strings.TrimSpace(os.Getenv(name)) if value == "" { return fallback, nil } b, err := strconv.ParseBool(value) if err != nil { return false, fmt.Errorf("%s must be a boolean: %w", name, err) } return b, nil } func envString(name, fallback string) string { if value := strings.TrimSpace(os.Getenv(name)); value != "" { return value } return fallback } func envInt(name string, fallback int) (int, error) { value := strings.TrimSpace(os.Getenv(name)) if value == "" { return fallback, nil } n, err := strconv.Atoi(value) if err != nil { return 0, fmt.Errorf("%s must be an integer: %w", name, err) } return n, nil }