package main import ( "fmt" "os" "strings" logger "git.site.quack-lab.dev/dave/cylogger" "github.com/joho/godotenv" ) var options Options func init() { var err error options, err = LoadOptions() if err != nil { logger.Error("Failed to load options %v", err) return } } type Options struct { DBPath string Port string ESIScopes []string ESIRedirectURI string ESIClientID string WebhookURL string WebhookEmail string WebhookToken string } func LoadOptions() (Options, error) { // Load environment variables strictly from .env file (fail if there's an error loading) if err := godotenv.Load(); err != nil { return Options{}, fmt.Errorf("error loading .env file: %w", err) } dbPath := getOrDefault("DB_PATH", "eve-pi.db") port := getOrDefault("HTTP_SERVER_PORT", "3000") clientID := getOrFatal("ESI_CLIENT_ID") redirectURI := getOrFatal("ESI_REDIRECT_URI") rawScopes := getOrDefault("ESI_SCOPES", "esi-planets.manage_planets.v1") scopes := strings.Fields(rawScopes) webhookUrl := getOrFatal("WEBHOOK_URL") webhookEmail := getOrFatal("WEBHOOK_EMAIL") webhookToken := getOrFatal("WEBHOOK_TOKEN") return Options{ DBPath: dbPath, Port: port, ESIClientID: clientID, ESIRedirectURI: redirectURI, ESIScopes: scopes, WebhookURL: webhookUrl, WebhookEmail: webhookEmail, WebhookToken: webhookToken, }, nil } func getOrFatal(key string) string { value := os.Getenv(key) if value == "" { logger.Error("Environment variable %s is required", key) os.Exit(1) } return value } func getOrDefault(key, defaultValue string) string { value := os.Getenv(key) if value == "" { return defaultValue } return value }