// Package environment provides strict parsing for runtime configuration. package environment import ( "fmt" "os" "strconv" "strings" "time" ) // String returns a trimmed environment value or fallback when it is empty. func String(name, fallback string) string { if value := strings.TrimSpace(os.Getenv(name)); value != "" { return value } return fallback } // Required returns a non-empty environment value. func Required(name string) (string, error) { value := strings.TrimSpace(os.Getenv(name)) if value == "" { return "", fmt.Errorf("%s must be set", name) } return value, nil } // Int parses an integer environment value. func Int(name string, fallback int) (int, error) { value := strings.TrimSpace(os.Getenv(name)) if value == "" { return fallback, nil } parsed, err := strconv.Atoi(value) if err != nil { return 0, fmt.Errorf("%s must be an integer: %w", name, err) } return parsed, nil } // Float parses a floating-point environment value. func Float(name string, fallback float64) (float64, error) { value := strings.TrimSpace(os.Getenv(name)) if value == "" { return fallback, nil } parsed, err := strconv.ParseFloat(value, 64) if err != nil { return 0, fmt.Errorf("%s must be a number: %w", name, err) } return parsed, nil } // Bool parses a boolean environment value. func Bool(name string, fallback bool) (bool, error) { value := strings.TrimSpace(os.Getenv(name)) if value == "" { return fallback, nil } parsed, err := strconv.ParseBool(value) if err != nil { return false, fmt.Errorf("%s must be a boolean: %w", name, err) } return parsed, nil } // Duration parses a Go duration environment value. func Duration(name string, fallback time.Duration) (time.Duration, error) { value := strings.TrimSpace(os.Getenv(name)) if value == "" { return fallback, nil } parsed, err := time.ParseDuration(value) if err != nil { return 0, fmt.Errorf("%s must be a duration: %w", name, err) } return parsed, nil } // CSV returns non-empty, trimmed comma-separated values. func CSV(name string) []string { value := strings.TrimSpace(os.Getenv(name)) if value == "" { return nil } parts := strings.Split(value, ",") result := make([]string, 0, len(parts)) for _, part := range parts { if part = strings.TrimSpace(part); part != "" { result = append(result, part) } } return result }