package main import ( "fmt" "os" "strings" "time" ) type config struct { ServerAddr string FrontendOrigin string ZarinHubEndpoint string ZarinHubToken string ZarinHubTimeout time.Duration DatabasePath string } func loadConfig() (config, error) { return readConfig(os.Getenv) } func readConfig(getenv func(string) string) (config, error) { token := strings.TrimSpace(getenv("ZARINHUB_ACCESS_TOKEN")) if token == "" { return config{}, fmt.Errorf("ZARINHUB_ACCESS_TOKEN is required") } timeoutText := valueOrDefault( getenv("ZARINHUB_TIMEOUT"), "5s", ) timeout, err := time.ParseDuration(timeoutText) if err != nil || timeout <= 0 { return config{}, fmt.Errorf( "ZARINHUB_TIMEOUT must be a positive duration", ) } return config{ ServerAddr: valueOrDefault( getenv("SERVER_ADDR"), "127.0.0.1:8080", ), FrontendOrigin: valueOrDefault( getenv("FRONTEND_ORIGIN"), "http://127.0.0.1:3000", ), ZarinHubEndpoint: valueOrDefault( getenv("ZARINHUB_ENDPOINT"), "https://zarin-hub.com/api/v5/KYC/CardToIban", ), ZarinHubToken: token, ZarinHubTimeout: timeout, DatabasePath: valueOrDefault( getenv("DATABASE_PATH"), "./card-to-iban.db", ), }, nil } func valueOrDefault(value string, fallback string) string { if strings.TrimSpace(value) == "" { return fallback } return strings.TrimSpace(value) }