8
8
"reflect"
9
9
"strconv"
10
10
"strings"
11
+ "time"
11
12
)
12
13
13
14
// options for formatting.
@@ -28,14 +29,14 @@ const (
28
29
noIdent = ""
29
30
)
30
31
31
- func formatValue (b * strings.Builder , prefix string , opt options , v reflect.Value ) {
32
+ func formatValue (b * strings.Builder , prefix , fieldName string , opt options , v reflect.Value ) {
32
33
switch v .Kind () {
33
34
case reflect .Struct , reflect .Ptr , reflect .Interface :
34
35
i , ok := v .Interface ().(Object )
35
36
if ok {
36
37
format (b , prefix + defaultIdent , opt , i )
37
38
} else if v .CanAddr () {
38
- formatValue (b , prefix , opt , v .Addr ())
39
+ formatValue (b , prefix , fieldName , opt , v .Addr ())
39
40
}
40
41
case reflect .Slice :
41
42
if buf , ok := v .Interface ().([]byte ); ok {
@@ -49,9 +50,22 @@ func formatValue(b *strings.Builder, prefix string, opt options, v reflect.Value
49
50
b .WriteString (prefix )
50
51
b .WriteString (defaultIdent )
51
52
b .WriteString ("- " )
52
- formatValue (b , prefix + defaultIdent , opt , vi )
53
+ formatValue (b , prefix + defaultIdent , fieldName , opt , vi )
53
54
b .WriteRune ('\n' )
54
55
}
56
+ case reflect .Int :
57
+ // Special case for date.
58
+ var (
59
+ now = time .Now ()
60
+ max = now .AddDate (0 , 0 , 7 ).Unix ()
61
+ min = now .AddDate (- 2 , 0 , 0 ).Unix ()
62
+ )
63
+ i := v .Int ()
64
+ if i > min && i < max && strings .Contains (fieldName , "date" ) {
65
+ b .WriteString (time .Unix (i , 0 ).UTC ().Format (time .RFC3339 ))
66
+ } else {
67
+ b .WriteString (strconv .FormatInt (i , 10 ))
68
+ }
55
69
default :
56
70
b .WriteString (fmt .Sprint (v .Interface ()))
57
71
}
@@ -91,7 +105,7 @@ func format(b *strings.Builder, prefix string, opt options, obj Object) {
91
105
b .WriteString (f .SchemaName )
92
106
b .WriteString (": " )
93
107
94
- formatValue (b , prefix , opt , v .FieldByName (f .Name ))
108
+ formatValue (b , prefix , f . SchemaName , opt , v .FieldByName (f .Name ))
95
109
}
96
110
}
97
111
0 commit comments