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