package common import ( "os" "strings" "github.com/pelletier/go-toml/v2" "github.com/rs/zerolog" l "github.com/rs/zerolog/log" ) const ( ConfigPath = "./config.toml" DefaultLogLevel = "info" DefaultPort = 8080 ) type Config struct { Log log Http http } type http struct { Port uint16 } type log struct { Level string } func defaultConfig() Config { return Config{ Log: log{ Level: DefaultLogLevel, }, Http: http{ Port: DefaultPort, }, } } func loadConfig(path string) Config { logger := l.Error().Str("path", path) config := defaultConfig() file, err := os.Open(path) if err != nil { logger.Err(err).Msg("cannot open file, using default config") return config } dec := toml.NewDecoder(file) err = dec.Decode(&config) if err != nil { logger.Err(err).Msg("cannot parse config, using default") return config } return config } func NewConfig() Config { return loadConfig(ConfigPath) } func (c *Config) LogLevel() zerolog.Level { switch strings.ToLower(c.Log.Level) { case "error": return zerolog.ErrorLevel case "debug": return zerolog.DebugLevel case "trace": return zerolog.TraceLevel case "warn": return zerolog.WarnLevel default: return zerolog.InfoLevel } }