package config import ( "github.com/spf13/viper" ) type Config struct { Server ServerConfig `mapstructure:"server"` Database DatabaseConfig `mapstructure:"database"` } type ServerConfig struct { Port string `mapstructure:"port"` Host string `mapstructure:"host"` } type DatabaseConfig struct { Type string `mapstructure:"type"` Path string `mapstructure:"path"` } func Load() (*Config, error) { viper.SetConfigName("config") viper.SetConfigType("yaml") viper.AddConfigPath(".") viper.AddConfigPath("./config") // Defaults viper.SetDefault("server.port", "8080") viper.SetDefault("server.host", "localhost") viper.SetDefault("database.type", "sqlite") viper.SetDefault("database.path", "./data.db") // Environment variables viper.AutomaticEnv() if err := viper.ReadInConfig(); err != nil { // Config file not found, use defaults if _, ok := err.(viper.ConfigFileNotFoundError); !ok { return nil, err } } var config Config if err := viper.Unmarshal(&config); err != nil { return nil, err } return &config, nil }