package config import ( "errors" "fmt" "net" "time" ) type Config struct { Server ServerConfig `mapstructure:"server"` Database DatabaseConfig `mapstructure:"database"` Storage StorageConfig `mapstructure:"storage"` JWT JWTConfig `mapstructure:"jwt"` } type ServerConfig struct { Host string `mapstructure:"host"` Port int `mapstructure:"port"` } type DatabaseConfig struct { Driver string `mapstructure:"driver"` Path string `mapstructure:"path"` } type StorageConfig struct { Driver string `mapstructure:"driver"` Local LocalStorageConfig `mapstructure:"local"` } type LocalStorageConfig struct { Path string `mapstructure:"path"` } type JWTConfig struct { Secret string `mapstructure:"secret"` AccessTTL time.Duration `mapstructure:"access_ttl"` RefreshTTL time.Duration `mapstructure:"refresh_ttl"` } func (c *Config) Validate() error { var errs []error if c.Server.Port < 1 || c.Server.Port > 65535 { errs = append(errs, fmt.Errorf("server.port: %d out of range [1, 65535]", c.Server.Port)) } if addr := net.ParseIP(c.Server.Host); c.Server.Host != "" && addr == nil { errs = append(errs, fmt.Errorf("server.host: %q is not a valid IP address", c.Server.Host)) } if c.Database.Path == "" { errs = append(errs, errors.New("database.path: must not be empty")) } if c.Storage.Local.Path == "" { errs = append(errs, errors.New("storage.local.path: must not be empty")) } if c.JWT.Secret == "" { errs = append(errs, errors.New("jwt.secret: must not be empty")) } if c.JWT.AccessTTL <= 0 { errs = append(errs, fmt.Errorf("jwt.access_ttl: %v must be positive", c.JWT.AccessTTL)) } if c.JWT.RefreshTTL <= 0 { errs = append(errs, fmt.Errorf("jwt.refresh_ttl: %v must be positive", c.JWT.RefreshTTL)) } return errors.Join(errs...) }