-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathstringers.go
53 lines (48 loc) · 1.38 KB
/
stringers.go
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
package jl
import (
"bytes"
"encoding/json"
"fmt"
"strings"
)
// Stringer transforms a field returned by the FieldFinder into a string.
type Stringer func(ctx *Context, v interface{}) string
var _ = Stringer(DefaultStringer)
var _ = Stringer(ErrorStringer)
// DefaultStringer attempts to turn a field into string by attempting the following in order
// 1. casting it to a string
// 2. unmarshalling it as a json.RawMessage
// 3. using fmt.Sprintf("%v", input)
func DefaultStringer(ctx *Context, v interface{}) string {
var s string
if tmp, ok := v.(string); ok {
s = tmp
} else if rawMsg, ok := v.(json.RawMessage); ok {
var unmarshaled interface{}
if err := json.Unmarshal(rawMsg, &unmarshaled); err != nil {
s = string(rawMsg)
} else {
s = fmt.Sprintf("%v", unmarshaled)
}
} else {
s = fmt.Sprintf("%v", v)
}
return s
}
// ErrorStringer stringifies LogrusError to a multiline string. If the field is not a LogrusError, it falls back
// to the DefaultStringer.
func ErrorStringer(ctx *Context, v interface{}) string {
w := &bytes.Buffer{}
if logrusErr, ok := v.(LogrusError); ok {
w.WriteString("\n ")
w.WriteString(logrusErr.Error)
w.WriteRune('\n')
// left pad with a tab
lines := strings.Split(logrusErr.Stack, "\n")
stackStr := "\t" + strings.Join(lines, "\n\t")
w.WriteString(stackStr)
return w.String()
} else {
return DefaultStringer(ctx, v)
}
}