-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtemplate.go.tmpl
114 lines (97 loc) · 3.27 KB
/
template.go.tmpl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Code generated by go-simpler.org/sloggen. DO NOT EDIT.
package {{$.Pkg}}
{{range $.Imports -}}
import "{{.}}"
{{end}}
{{range $severity, $name := $.Levels -}}
const Level{{title $name}} = slog.Level({{$severity}})
{{end}}
{{range $.Consts -}}
const {{camel .}} = "{{.}}"
{{end}}
{{range $key, $type := $.Attrs -}}
func {{camel $key}}(value {{$type}}) slog.Attr { return slog.{{slogFunc $type}}("{{$key}}", value) }
{{end}}
{{if gt (len $.Levels) 0}}
func ParseLevel(s string) (slog.Level, error) {
switch strings.ToUpper(s) {
{{range $_, $name := $.Levels -}}
case "{{upper $name}}":
return Level{{title $name}}, nil
{{end -}}
default:
return 0, fmt.Errorf("slog: level string %q: unknown name", s)
}
}
func RenameLevels(_ []string, attr slog.Attr) slog.Attr {
if attr.Key != slog.LevelKey {
return attr
}
switch attr.Value.Any().(slog.Level) {
{{range $_, $name := $.Levels -}}
case Level{{title $name}}:
attr.Value = slog.StringValue("{{upper $name}}")
{{end -}}
}
return attr
}
{{end}}
{{if $l := $.Logger}}
type Logger struct{ handler slog.Handler }
func New(h slog.Handler) *Logger { return &Logger{handler: h} }
func (l *Logger) Handler() slog.Handler { return l.handler }
func (l *Logger) Enabled(ctx context.Context, level slog.Level) bool {
return l.handler.Enabled(ctx, level)
}
func (l *Logger) With({{if $l.AttrAPI}}attrs ...slog.Attr{{else}}args ...any{{end}}) *Logger {
if len({{if $l.AttrAPI}}attrs{{else}}args{{end}}) == 0 {
return l
}
return &Logger{handler: l.handler.WithAttrs({{if $l.AttrAPI}}attrs{{else}}args2attrs(args){{end}})}
}
func (l *Logger) WithGroup(name string) *Logger {
if name == "" {
return l
}
return &Logger{handler: l.handler.WithGroup(name)}
}
func (l *Logger) Log({{if $l.Context}}ctx context.Context, {{end}}level slog.Level, msg string, {{if $l.AttrAPI}}attrs ...slog.Attr{{else}}args ...any{{end}}) {
l.log({{if $l.Context}}ctx{{else}}context.Background(){{end}}, level, msg, {{if $l.AttrAPI}}attrs{{else}}args{{end}})
}
{{range $_, $name := $l.Levels}}
func (l *Logger) {{title $name}}({{if $l.Context}}ctx context.Context, {{end}}msg string, {{if $l.AttrAPI}}attrs ...slog.Attr{{else}}args ...any{{end}}) {
l.log({{if $l.Context}}ctx{{else}}context.Background(){{end}}, {{if eq (len $.Levels) 0}}slog.{{end}}Level{{title $name}}, msg, {{if $l.AttrAPI}}attrs{{else}}args{{end}})
}
{{end}}
func (l *Logger) log(ctx context.Context, level slog.Level, msg string, {{if $l.AttrAPI}}attrs []slog.Attr{{else}}args []any{{end}}) {
if !l.handler.Enabled(ctx, level) {
return
}
var pcs [1]uintptr
runtime.Callers(3, pcs[:])
r := slog.NewRecord(time.Now(), level, msg, pcs[0])
r.Add{{if $l.AttrAPI}}Attrs(attrs...){{else}}(args...){{end}}
_ = l.handler.Handle(ctx, r)
}
{{if not $l.AttrAPI}}
{{/* based on argsToAttrSlice() and argsToAttr() from log/slog sources. */}}
func args2attrs(args []any) []slog.Attr {
var attrs []slog.Attr
for len(args) > 0 {
switch x := args[0].(type) {
case string:
if len(args) == 1 {
attrs, args = append(attrs, slog.String("!BADKEY", x)), nil
} else {
attrs, args = append(attrs, slog.Any(x, args[1])), args[2:]
}
case slog.Attr:
attrs, args = append(attrs, x), args[1:]
default:
attrs, args = append(attrs, slog.Any("!BADKEY", x)), args[1:]
}
}
return attrs
}
{{end}}
{{end}}