Short and single-letter names in application code become full words (tests keep theirs). Wrapped calls, signatures and composite literals put one item per line, and one-line function bodies are expanded. Exported names and groups of constants get doc comments, and comments refer to the renamed identifiers.
82 lines
2.0 KiB
Go
82 lines
2.0 KiB
Go
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) ----------
|
|
|
|
func (c JSCLogging) Map() map[string]any { return mapOf(c) }
|
|
|
|
func (c JSCLogging) Flatten() map[string]any {
|
|
return flattenOf(JSCKLogging, c)
|
|
}
|
|
|
|
func (c JSCLogging) TypeOf(key string) (reflect.Kind, error) {
|
|
return typeOf(c, key)
|
|
}
|
|
|
|
func (c JSCLogging) ValueOf(key string) (any, error) {
|
|
return valueOf(c, key)
|
|
}
|
|
|
|
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(
|
|
"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 *JSCLogging) LogLevel() slog.Level {
|
|
return ConfigLevelToLogLevel(c.Level)
|
|
}
|