-
Notifications
You must be signed in to change notification settings - Fork 1
/
format.go
110 lines (106 loc) · 2.96 KB
/
format.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
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
package errors
import (
"fmt"
"io"
"runtime"
"time"
)
type Format func(s fmt.State, verb rune, e Errors)
func DefaultFormatFn(s fmt.State, verb rune, e Errors) {
switch verb {
case 'v':
switch {
case s.Flag('+'):
_, _ = fmt.Fprintf(s, "- %s\n", e.Error())
for i, pc := range e.PCS() {
fn := runtime.FuncForPC(pc)
if fn == nil {
_, _ = io.WriteString(s, "unknown")
} else {
file, line := fn.FileLine(pc)
_, filename := fileName(file)
if i == 0 {
_, _ = fmt.Fprintf(s, "\t[T] %s\n\t[F] %s\n\t[F] %s:%d \n", e.OccurTime().Format(time.RFC3339), fn.Name(), filename, line)
} else {
_, _ = fmt.Fprintf(s, "\t[F] %s\n\t[F] %s:%d \n", fn.Name(), filename, line)
}
}
}
if e.Cause() != nil {
hasCause, ok := e.Cause().(Errors)
if !ok {
_, _ = fmt.Fprintf(s, "%v\n", e.Cause())
} else {
hasCause.Format(s, verb)
}
}
case s.Flag('-'):
_, _ = io.WriteString(s, "{")
_, _ = fmt.Fprintf(s, `"msg":"%s", "occurTime":"%s", "stack":[`, e.Error(), e.OccurTime().Format(time.RFC3339))
for i, pc := range e.PCS() {
if i > 0 {
_, _ = io.WriteString(s, ",")
}
fn := runtime.FuncForPC(pc)
if fn == nil {
_, _ = fmt.Fprintf(s, `{"fn":"%s", "file":"%s", "line":%d}`, "unknown", "unknown", 0)
} else {
file, line := fn.FileLine(pc)
_, filename := fileName(file)
_, _ = fmt.Fprintf(s, `{"fn":"%s", "file":"%s", "line":%d}`, fn.Name(), filename, line)
}
}
_, _ = io.WriteString(s, "]")
if e.Cause() != nil {
_, _ = io.WriteString(s, ",")
hasCause, ok := e.Cause().(Errors)
if !ok {
_, _ = fmt.Fprintf(s, `"cause":{"msg":"%s"}`, e.Cause().Error())
} else {
_, _ = io.WriteString(s, `"cause":`)
hasCause.Format(s, verb)
}
}
_, _ = io.WriteString(s, "}")
default:
_, _ = fmt.Fprintf(s, "%s", e.Error())
}
}
}
func JsonFormatFn(s fmt.State, verb rune, e Errors) {
switch verb {
case 'v':
switch {
case s.Flag('+'):
_, _ = io.WriteString(s, "{")
_, _ = fmt.Fprintf(s, `"msg":"%s", "occurTime":"%s", "stack":[`, e.Error(), e.OccurTime().Format(time.RFC3339))
for i, pc := range e.PCS() {
if i > 0 {
_, _ = io.WriteString(s, ",")
}
fn := runtime.FuncForPC(pc)
if fn == nil {
_, _ = fmt.Fprintf(s, `{"fn":"%s", "home":"%s", "file":"%s", "line":%d}`, "unknown", "unknown", "unknown", 0)
} else {
file, line := fn.FileLine(pc)
home, filename := fileName(file)
_, _ = fmt.Fprintf(s, `{"fn":"%s", "home":"%s", "file":"%s", "line":%d}`, fn.Name(), home, filename, line)
}
}
_, _ = io.WriteString(s, "]")
if e.Cause() != nil {
_, _ = io.WriteString(s, ",")
hasCause, ok := e.Cause().(Errors)
if !ok {
_, _ = fmt.Fprintf(s, `"cause":{"msg":"%s"}`, e.Cause().Error())
} else {
_, _ = io.WriteString(s, `"cause":`)
hasCause.Format(s, verb)
}
}
_, _ = io.WriteString(s, "}")
default:
_, _ = fmt.Fprintf(s, "%s", e.Error())
}
}
}