Files
sub2api-cn-relay-manager/internal/config/config.go
2026-05-12 22:44:30 +08:00

83 lines
1.7 KiB
Go

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
}