package config import ( "fmt" "net" "os" "strconv" "time" "gopkg.in/yaml.v3" ) type Config struct { Server ServerConfig `yaml:"server"` Export ExportConfig `yaml:"export"` Logging LoggingConfig `yaml:"logging"` Backup BackupConfig `yaml:"backup"` } type ServerConfig struct { Host string `yaml:"host"` Port int `yaml:"port"` Mode string `yaml:"mode"` ReadTimeout time.Duration `yaml:"read_timeout"` WriteTimeout time.Duration `yaml:"write_timeout"` } type LoggingConfig struct { Level string `yaml:"level"` Format string `yaml:"format"` Output string `yaml:"output"` FilePath string `yaml:"file_path"` } // ExportConfig is kept for constructor compatibility in export services. // Runtime no longer persists an export section in config.yaml. type ExportConfig struct{} type BackupConfig struct { Time string `yaml:"time"` } func Load(path string) (*Config, error) { data, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("reading config file: %w", err) } var cfg Config if err := yaml.Unmarshal(data, &cfg); err != nil { return nil, fmt.Errorf("parsing config file: %w", err) } cfg.setDefaults() return &cfg, nil } func (c *Config) setDefaults() { if c.Server.Host == "" { c.Server.Host = "127.0.0.1" } if c.Server.Port == 0 { c.Server.Port = 8080 } if c.Server.Mode == "" { c.Server.Mode = "release" } if c.Server.ReadTimeout == 0 { c.Server.ReadTimeout = 30 * time.Second } if c.Server.WriteTimeout == 0 { c.Server.WriteTimeout = 30 * time.Second } if c.Logging.Level == "" { c.Logging.Level = "info" } if c.Logging.Format == "" { c.Logging.Format = "json" } if c.Logging.Output == "" { c.Logging.Output = "stdout" } if c.Backup.Time == "" { c.Backup.Time = "00:00" } } func (c *Config) Address() string { return net.JoinHostPort(c.Server.Host, strconv.Itoa(c.Server.Port)) }