package config import ( "bytes" "log/slog" "os" "git.loyso.art/frx/kurious/internal/common/errors" ) type LogFormat uint8 const ( LogFormatText LogFormat = iota LogFormatJSON ) func (f *LogFormat) UnmarshalText(data []byte) error { switch format := string(bytes.ToLower(data)); format { case "json": *f = LogFormatJSON case "text": *f = LogFormatText default: return errors.NewValidationError("format", "unsupported value "+format) } return nil } type LogLevel uint8 const ( LogLevelDebug LogLevel = iota LogLevelInfo LogLevelWarn LogLevelError ) func (lvl *LogLevel) UnmarshalText(data []byte) error { switch level := string(bytes.ToLower(data)); level { case "debug", "": *lvl = LogLevelDebug case "info": *lvl = LogLevelInfo case "warn": *lvl = LogLevelWarn case "error": *lvl = LogLevelError default: return errors.NewValidationError("level", "unsupported value "+level) } return nil } type Log struct { Level LogLevel `json:"level"` Format LogFormat `json:"format"` } func NewSLogger(config Log) *slog.Logger { var level slog.Level switch config.Level { case LogLevelDebug: level = slog.LevelDebug case LogLevelInfo: level = slog.LevelInfo case LogLevelWarn: level = slog.LevelWarn case LogLevelError: level = slog.LevelError } opts := &slog.HandlerOptions{ Level: level, } var h slog.Handler switch config.Format { case LogFormatJSON: h = slog.NewJSONHandler(os.Stdout, opts) case LogFormatText: h = slog.NewTextHandler(os.Stdout, opts) } return slog.New(h) }