package config import ( "fmt" "os" "strings" ) const ( EnvListenAddr = "SUB2API_CRM_LISTEN_ADDR" EnvSQLiteDSN = "SUB2API_CRM_SQLITE_DSN" EnvAdminToken = "SUB2API_CRM_ADMIN_TOKEN" DefaultListenAddr = ":8080" DefaultSQLiteDSN = "file:sub2api-cn-relay-manager.db?_foreign_keys=on&_busy_timeout=5000" ) type ServerConfig struct { ListenAddr string } type DatabaseConfig struct { SQLiteDSN string } type StartupConfig struct { Server ServerConfig Database DatabaseConfig } func LoadStartupFromEnv() (StartupConfig, error) { return loadStartupFromLookupEnv(os.LookupEnv) } func loadStartupFromLookupEnv(lookup func(string) (string, bool)) (StartupConfig, error) { cfg := StartupConfig{ Server: ServerConfig{ ListenAddr: readOptionalEnv(lookup, EnvListenAddr, DefaultListenAddr), }, Database: DatabaseConfig{ SQLiteDSN: readOptionalEnv(lookup, EnvSQLiteDSN, DefaultSQLiteDSN), }, } return cfg, nil } func LoadAdminTokenFromEnv() (string, error) { return loadAdminTokenFromLookupEnv(os.LookupEnv) } func loadAdminTokenFromLookupEnv(lookup func(string) (string, bool)) (string, error) { token := strings.TrimSpace(readRequiredEnv(lookup, EnvAdminToken)) if token == "" { return "", fmt.Errorf("%s is required", EnvAdminToken) } return token, nil } func readOptionalEnv(lookup func(string) (string, bool), key string, defaultValue string) string { value, ok := lookup(key) if !ok { return defaultValue } value = strings.TrimSpace(value) if value == "" { return defaultValue } return value } func readRequiredEnv(lookup func(string) (string, bool), key string) string { value, ok := lookup(key) if !ok { return "" } return value }