package config import ( "context" "log/slog" "os" "time" ) type Config struct { // time configuration TimeFormat string `default:"2006-01-02 15:04:05" env:"time_format"` TimeZoneLocal string `default:"America/Chicago" env:"time_zone"` TZLocal *time.Location `ignored:"true"` TZUTC *time.Location `ignored:"true"` // logging LogLevel int `default:"50" env:"log_level"` Log *Log `ignored:"true"` // webserver WebServerPort int `default:"8080" env:"webserver_port"` WebServerIP string `default:"0.0.0.0" env:"webserver_ip"` WebServerReadTimeout int `default:"5" env:"webserver_read_timeout"` WebServerWriteTimeout int `default:"1" env:"webserver_write_timeout"` WebServerIdleTimeout int `default:"2" env:"webserver_idle_timeout"` } // New initializes the config variable for use with a prepared set of defaults. func New() Config { cfg := Config{ Log: &Log{ SLogLevel: new(slog.LevelVar), }, } // Initialize Logger cfg.Log.Log = slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ Level: cfg.Log.SLogLevel, ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr { if a.Key == slog.LevelKey { level := a.Value.Any().(slog.Level) levelLabel, exists := LevelNames[level] if !exists { levelLabel = level.String() } a.Value = slog.StringValue(levelLabel) } return a }, })) cfg.Log.Ctx = context.Background() return cfg }