-
Notifications
You must be signed in to change notification settings - Fork 0
/
tag.go
102 lines (87 loc) · 1.76 KB
/
tag.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
package env
import (
"strconv"
"strings"
)
type structTag struct {
name string // name of tag
omitempty bool // use omit empty value
skip bool // skip this tag
dft string // default value
raw string
fieldName string
}
func newStructTag(fieldName string, rawStructTag string) *structTag {
tag := &structTag{
fieldName: fieldName,
raw: rawStructTag,
}
return tag.parseTag()
}
// withPrefix should be called after parseTag.
func (t *structTag) withPrefix(prefix string) *structTag {
if len(prefix) > 0 {
t.name = prefix + "_" + t.name
}
return t
}
func (t *structTag) defaultInt64() (int64, error) {
defaultValue := int64(0)
if t.omitempty != true {
var err error
defaultValue, err = strconv.ParseInt(t.dft, 10, 64)
if err != nil {
return 0, err
}
}
return defaultValue, nil
}
func (t *structTag) defaultBool() (bool, error) {
defaultValue := false
if t.omitempty != true {
var err error
defaultValue, err = strconv.ParseBool(t.dft)
if err != nil {
return false, err
}
}
return defaultValue, nil
}
func (t *structTag) defaultString() (string, error) {
defaultValue := ""
if t.omitempty != true {
defaultValue = t.dft
}
return defaultValue, nil
}
func (t *structTag) parseTag() *structTag {
list := strings.SplitN(t.raw, ",", 2)
var options [2]string
for i, op := range list {
options[i] = fix(op)
}
// tag name
switch options[0] {
case "-":
t.skip = true
case "":
// use origin field name
t.name = t.fieldName
default:
t.name = options[0]
}
// tag default value
switch options[1] {
case "":
// use omit empty value
t.omitempty = true
default:
t.dft = options[1]
}
return t
}
func fix(s string) string {
s = strings.Trim(s, " ")
s = strings.Trim(s, "\t")
return s
}