config.goraw
package config
import (
"fmt"
"os"
"strconv"
"time"
)
type Config struct {
Address string
AllowedOrigin string
SessionTTL time.Duration
CleanupInterval time.Duration
SecureCookies bool
}
func Load() (Config, error) {
ttl, err := durationFromEnv("SESSION_TTL", 30*time.Minute)
if err != nil {
return Config{}, err
}
cleanup, err := durationFromEnv("SESSION_CLEANUP_INTERVAL", time.Minute)
if err != nil {
return Config{}, err
}
secureCookies, err := boolFromEnv("SECURE_COOKIES", false)
if err != nil {
return Config{}, err
}
return Config{
Address: stringFromEnv("HTTP_ADDR", ":8080"),
AllowedOrigin: stringFromEnv("APP_ORIGIN", "http://localhost:3000"),
SessionTTL: ttl,
CleanupInterval: cleanup,
SecureCookies: secureCookies,
}, nil
}
func stringFromEnv(name, fallback string) string {
if value := os.Getenv(name); value != "" {
return value
}
return fallback
}
func durationFromEnv(name string, fallback time.Duration) (time.Duration, error) {
value := os.Getenv(name)
if value == "" {
return fallback, nil
}
duration, err := time.ParseDuration(value)
if err != nil || duration <= 0 {
return 0, fmt.Errorf("%s must be a positive duration", name)
}
return duration, nil
}
func boolFromEnv(name string, fallback bool) (bool, error) {
value := os.Getenv(name)
if value == "" {
return fallback, nil
}
result, err := strconv.ParseBool(value)
if err != nil {
return false, fmt.Errorf("%s must be true or false", name)
}
return result, nil
}