1
|
|
|
package metadata |
2
|
|
|
|
3
|
|
|
import ( |
4
|
|
|
"github.com/vvval/go-metadata-scanner/util" |
5
|
|
|
"strings" |
6
|
|
|
) |
7
|
|
|
|
8
|
|
|
const separator string = "<sep>" |
9
|
|
|
|
10
|
|
|
type Tags map[string]interface{} |
11
|
|
|
|
12
|
|
|
func (t Tags) Tag(tag string) (interface{}, bool) { |
13
|
|
|
v, ok := t[tag] |
14
|
|
|
|
15
|
|
|
return v, ok |
16
|
|
|
} |
17
|
|
|
|
18
|
|
|
func (t Tags) Count() int { |
19
|
|
|
return len(t) |
20
|
|
|
} |
21
|
|
|
|
22
|
|
|
type Payload struct { |
23
|
|
|
tags Tags |
24
|
|
|
lists []string |
25
|
|
|
} |
26
|
|
|
|
27
|
|
|
func New() Payload { |
28
|
|
|
return Payload{tags: Tags{}} |
29
|
|
|
} |
30
|
|
|
|
31
|
|
|
func Separator() string { |
32
|
|
|
return separator |
33
|
|
|
} |
34
|
|
|
|
35
|
|
|
func (p *Payload) UseSeparator() bool { |
36
|
|
|
for _, tag := range p.lists { |
37
|
|
|
if strings.Contains(p.tags[tag].(string), separator) { |
38
|
|
|
return true |
39
|
|
|
} |
40
|
|
|
} |
41
|
|
|
|
42
|
|
|
return false |
43
|
|
|
} |
44
|
|
|
|
45
|
|
|
func (p *Payload) Tags() Tags { |
46
|
|
|
return p.tags |
47
|
|
|
} |
48
|
|
|
|
49
|
|
|
func (p *Payload) ListTags() []string { |
50
|
|
|
return p.lists |
51
|
|
|
} |
52
|
|
|
|
53
|
|
|
func (p *Payload) AddBool(tag string, value bool) { |
54
|
|
|
p.tags[tag] = value |
55
|
|
|
} |
56
|
|
|
|
57
|
|
|
func (p *Payload) AddList(tag string, value []string) { |
58
|
|
|
p.tags[tag] = strings.Join(util.UniqueValues(value), separator) |
59
|
|
|
p.lists = util.UniqueValues(append(p.lists, tag)) |
60
|
|
|
} |
61
|
|
|
|
62
|
|
|
func (p *Payload) UpdateList(tag string, value []string) { |
63
|
|
|
keywords, ok := p.tags[tag].(string) |
64
|
|
|
if !ok { |
65
|
|
|
keywords = "" |
66
|
|
|
} |
67
|
|
|
|
68
|
|
|
values := strings.Split(keywords, separator) |
69
|
|
|
values = append(values, value...) |
70
|
|
|
p.AddList(tag, values) |
71
|
|
|
} |
72
|
|
|
|
73
|
|
|
func (p *Payload) AddTag(tag string, value string) { |
74
|
|
|
p.tags[tag] = filter(value) |
75
|
|
|
} |
76
|
|
|
|
77
|
|
|
func filter(value interface{}) interface{} { |
78
|
|
|
if str, ok := value.(string); ok { |
79
|
|
|
if strings.EqualFold(str, "true") { |
80
|
|
|
return true |
81
|
|
|
} |
82
|
|
|
|
83
|
|
|
if strings.EqualFold(str, "false") { |
84
|
|
|
return false |
85
|
|
|
} |
86
|
|
|
|
87
|
|
|
return str |
88
|
|
|
} |
89
|
|
|
|
90
|
|
|
return value |
91
|
|
|
} |
92
|
|
|
|