-
Notifications
You must be signed in to change notification settings - Fork 0
/
fieldtag.go
51 lines (45 loc) · 1.07 KB
/
fieldtag.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
package data
import "strings"
// FieldTag 是一个解析完成的字段 tag。
//
// 格式是:
// data:"alias,opt1,opt2,..."
//
// 当前支持以下选项:
// - omitempty:忽略空值
// - squash:将一个字段的内容展开到当前 struct
//
// 当 alias 为“-”时,当前字段会被跳过。
type FieldTag struct {
Alias string // 字段别名。
Skipped bool // 字段别名为“-”时,跳过这个字段。
OmitEmpty bool // 忽略空值。
Squash bool // 是否展开。
}
// ParseFieldTag 解析 field tag 的 alias 和选项。
// 详细的格式见 FieldTag 文档。
func ParseFieldTag(tag string) *FieldTag {
opts := strings.Split(tag, ",")
alias := strings.TrimSpace(opts[0])
skipped := false
omitEmpty := false
squash := false
for _, opt := range opts[1:] {
switch opt {
case "omitempty":
omitEmpty = true
case "squash":
squash = true
}
}
if alias == "-" {
alias = ""
skipped = true
}
return &FieldTag{
Alias: alias,
Skipped: skipped,
OmitEmpty: omitEmpty,
Squash: squash,
}
}