package platform import ( "fmt" "log/slog" "os" "strings" ) const ( DatabaseModePostgres = "postgres" DatabaseModeMemory = "memory" ) type Config struct { HTTPAddress string DatabaseMode string DatabaseURL string StaticDir string LogLevelName string } func LoadConfig() (Config, error) { cfg := Config{ HTTPAddress: valueOrDefault("SENSE_HTTP_ADDRESS", "127.0.0.1:18080"), DatabaseMode: strings.ToLower(valueOrDefault("SENSE_DATABASE_MODE", DatabaseModePostgres)), DatabaseURL: strings.TrimSpace(os.Getenv("SENSE_DATABASE_URL")), StaticDir: strings.TrimSpace(os.Getenv("SENSE_UI_STATIC_DIR")), LogLevelName: strings.ToLower(valueOrDefault("SENSE_LOG_LEVEL", "info")), } switch cfg.DatabaseMode { case DatabaseModePostgres: if cfg.DatabaseURL == "" { return Config{}, fmt.Errorf("SENSE_DATABASE_URL is required when SENSE_DATABASE_MODE=postgres") } case DatabaseModeMemory: // Explicitly limited to local smoke tests and automated tests. default: return Config{}, fmt.Errorf("unsupported SENSE_DATABASE_MODE %q", cfg.DatabaseMode) } return cfg, nil } func (c Config) LogLevel() slog.Level { switch c.LogLevelName { case "debug": return slog.LevelDebug case "warn": return slog.LevelWarn case "error": return slog.LevelError default: return slog.LevelInfo } } func valueOrDefault(key, fallback string) string { if value := strings.TrimSpace(os.Getenv(key)); value != "" { return value } return fallback }