package observability import ( "fmt" "io" "log/slog" "os" "strings" "git.warky.dev/wdevs/amcs/internal/config" ) func NewLogger(cfg config.LoggingConfig) (*slog.Logger, error) { level, err := parseLevel(cfg.Level) if err != nil { return nil, err } options := &slog.HandlerOptions{Level: level} handler, err := newHandler(cfg.Format, os.Stdout, options) if err != nil { return nil, err } return slog.New(handler), nil } func parseLevel(value string) (slog.Leveler, error) { switch strings.ToLower(strings.TrimSpace(value)) { case "", "info": return slog.LevelInfo, nil case "debug": return slog.LevelDebug, nil case "warn", "warning": return slog.LevelWarn, nil case "error": return slog.LevelError, nil default: return nil, fmt.Errorf("invalid logging.level %q", value) } } func newHandler(format string, w io.Writer, opts *slog.HandlerOptions) (slog.Handler, error) { switch strings.ToLower(strings.TrimSpace(format)) { case "", "json": return slog.NewJSONHandler(w, opts), nil case "text": return slog.NewTextHandler(w, opts), nil default: return nil, fmt.Errorf("invalid logging.format %q", format) } }