From b364bee26534f4ada00d0fc68665ea212fbc6fed Mon Sep 17 00:00:00 2001 From: arnef Date: Sun, 30 Aug 2026 19:54:34 +0200 Subject: [PATCH] refactor: simplify config validation --- internal/config/config.go | 101 ++++++++++++++------------------------ 1 file changed, 37 insertions(+), 64 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index 6287303..9d487dc 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -3,97 +3,70 @@ package config import ( "fmt" "os" - - "gopkg.in/yaml.v3" + "strconv" ) // Config is the top-level server configuration. type Config struct { - Server ServerConfig `yaml:"server"` - Auth AuthConfig `yaml:"auth"` - Storage StorageConfig `yaml:"storage"` - TLS TLSConfig `yaml:"tls"` - Logging LoggingConfig `yaml:"logging"` + Server ServerConfig + Auth AuthConfig + Storage StorageConfig + Logging LoggingConfig } type ServerConfig struct { - Host string `yaml:"host"` - Port int `yaml:"port"` - // Base URL used in DAV responses (e.g. https://dav.example.com) - BaseURL string `yaml:"base_url"` + Host string + Port int + BaseURL string } type AuthConfig struct { - // Realm shown in WWW-Authenticate header - Realm string `yaml:"realm"` + Realm string } type StorageConfig struct { - // Root directory for all data - DataDir string `yaml:"data_dir"` -} - -type TLSConfig struct { - Enabled bool `yaml:"enabled"` - CertFile string `yaml:"cert_file"` - KeyFile string `yaml:"key_file"` + DataDir string } type LoggingConfig struct { - Level string `yaml:"level"` // debug | info | warn | error - Format string `yaml:"format"` // text | json + Level string + Format string } -// Load reads and parses a YAML config file. -func Load(path string) (*Config, error) { - data, err := os.ReadFile(path) - if err != nil { - return nil, fmt.Errorf("reading config %q: %w", path, err) - } - +// Load reads and parses environment variables to create the configuration. +func Load() (*Config, error) { cfg := &Config{} - if err := yaml.Unmarshal(data, cfg); err != nil { - return nil, fmt.Errorf("parsing config %q: %w", path, err) - } - cfg.applyDefaults() - - return cfg, cfg.validate() + return cfg, nil } func (c *Config) applyDefaults() { - if c.Server.Host == "" { - c.Server.Host = "0.0.0.0" - } - if c.Server.Port == 0 { - c.Server.Port = 8080 - } + c.Server.Host = getEnv("NIDUS_HOST", "0.0.0.0") + c.Server.Port = getEnvInt("NIDUS_PORT", 8080) + c.Server.BaseURL = getEnv("NIDUS_BASE_URL", "") + if c.Server.BaseURL == "" { - scheme := "http" - if c.TLS.Enabled { - scheme = "https" - } - c.Server.BaseURL = fmt.Sprintf("%s://%s:%d", scheme, c.Server.Host, c.Server.Port) - } - if c.Auth.Realm == "" { - c.Auth.Realm = "DAV Server" - } - if c.Storage.DataDir == "" { - c.Storage.DataDir = "./data" - } - if c.Logging.Level == "" { - c.Logging.Level = "info" - } - if c.Logging.Format == "" { - c.Logging.Format = "text" + c.Server.BaseURL = fmt.Sprintf("http://%s:%d", c.Server.Host, c.Server.Port) } + + c.Auth.Realm = getEnv("NIDUS_AUTH_REALM", "DAV Server") + c.Storage.DataDir = getEnv("NIDUS_DATA_DIR", "./data") + c.Logging.Level = getEnv("NIDUS_LOG_LEVEL", "info") + c.Logging.Format = getEnv("NIDUS_LOG_FORMAT", "text") } -func (c *Config) validate() error { - if c.TLS.Enabled { - if c.TLS.CertFile == "" || c.TLS.KeyFile == "" { - return fmt.Errorf("tls.cert_file and tls.key_file are required when tls is enabled") +func getEnv(key string, defaultValue string) string { + if val := os.Getenv(key); val != "" { + return val + } + return defaultValue +} + +func getEnvInt(key string, defaultValue int) int { + if val := os.Getenv(key); val != "" { + if intVal, err := strconv.Atoi(val); err == nil { + return intVal } } - return nil + return defaultValue }