package config import ( "errors" "log/slog" "reflect" ) // JSCKLogging is the logging section's configuration key. const JSCKLogging string = "logging" // JobSearchConfigLogging configures logging. Level is one of debug, info, // warn or error. File, if set, is where commands that log to a file write. type JobSearchConfigLogging struct { Level string `cfg:"level" default:"warn"` File string `cfg:"file"` } // ---------- Section methods (see Section) ---------- func (c JobSearchConfigLogging) Map() map[string]any { return mapOf(c) } func (c JobSearchConfigLogging) Flatten() map[string]any { return flattenOf(JSCKLogging, c) } func (c JobSearchConfigLogging) TypeOf(key string) (reflect.Kind, error) { return typeOf(c, key) } func (c JobSearchConfigLogging) ValueOf(key string) (any, error) { return valueOf(c, key) } func (c *JobSearchConfigLogging) SetValue(key string, value any) error { return setValue(c, key, value) } // Keys returns the keys directly in the section. func (c *JobSearchConfigLogging) Keys() []string { return keysOf(c) } // ---------- Section specific methods ---------- // validate checks values before they are stored (see validator). func (c *JobSearchConfigLogging) validate(key string, value any) error { switch key { case "level": switch value.(string) { case "debug", "info", "warn", "error": default: return errors.New( "invalid log level. Must be one of: debug, info, warn, error") } } return nil } // ConfigLevelToLogLevel converts a configured level name to an slog level. An // unknown name gives 99, above every real level, so nothing is logged. func ConfigLevelToLogLevel(level string) slog.Level { switch level { case "debug": return slog.LevelDebug case "info": return slog.LevelInfo case "warn": return slog.LevelWarn case "error": return slog.LevelError default: return 99 } } // LogLevel returns the configured level as an slog level. An unknown level // gives 99, above every real level, so nothing is logged. func (c *JobSearchConfigLogging) LogLevel() slog.Level { return ConfigLevelToLogLevel(c.Level) }