50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
type Config struct {
|
|
Environment string
|
|
HTTPAddress string
|
|
DatabaseURL string
|
|
SessionSecret string
|
|
CookieSecure bool
|
|
ShutdownTimeout time.Duration
|
|
}
|
|
|
|
func Load() (Config, error) {
|
|
cfg := Config{
|
|
Environment: value("BELL_ENV", "development"),
|
|
HTTPAddress: value("BELL_HTTP_ADDRESS", "127.0.0.1:8082"),
|
|
DatabaseURL: os.Getenv("BELL_DATABASE_URL"),
|
|
SessionSecret: os.Getenv("BELL_SESSION_SECRET"),
|
|
ShutdownTimeout: 10 * time.Second,
|
|
}
|
|
if raw := os.Getenv("BELL_SHUTDOWN_SECONDS"); raw != "" {
|
|
seconds, err := strconv.Atoi(raw)
|
|
if err != nil || seconds < 1 || seconds > 300 {
|
|
return Config{}, fmt.Errorf("BELL_SHUTDOWN_SECONDS must be between 1 and 300")
|
|
}
|
|
cfg.ShutdownTimeout = time.Duration(seconds) * time.Second
|
|
}
|
|
if cfg.DatabaseURL == "" {
|
|
return Config{}, fmt.Errorf("BELL_DATABASE_URL is required")
|
|
}
|
|
if len(cfg.SessionSecret) < 32 {
|
|
return Config{}, fmt.Errorf("BELL_SESSION_SECRET must contain at least 32 characters")
|
|
}
|
|
cfg.CookieSecure = cfg.Environment == "production"
|
|
return cfg, nil
|
|
}
|
|
|
|
func value(name, fallback string) string {
|
|
if value := os.Getenv(name); value != "" {
|
|
return value
|
|
}
|
|
return fallback
|
|
}
|