-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathstring_map.go
More file actions
84 lines (76 loc) · 1.76 KB
/
string_map.go
File metadata and controls
84 lines (76 loc) · 1.76 KB
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
package database
import (
"database/sql"
"database/sql/driver"
"encoding/json"
"errors"
"github.com/stackrox/rox/pkg/set"
)
// NewStringToStringsMap creates a NewStringToStringsMap from a string to string set map.
func NewStringToStringsMap(m map[string]set.StringSet) interface {
driver.Valuer
sql.Scanner
} {
return (*StringToStringsMap)(&m)
}
// StringToStringsMap defines driver.Valuer and sql.Scanner for a map from string to set of string
type StringToStringsMap map[string]set.StringSet
type internalMap map[string][]string
// Value returns the JSON-encoded representation
func (m StringToStringsMap) Value() (driver.Value, error) {
if m == nil {
return json.Marshal(nil)
}
converted := make(internalMap, len(m))
for k, v := range m {
converted[k] = v.AsSortedSlice(func(i, j string) bool {
return i < j
})
}
return json.Marshal(converted)
}
// Scan Decodes a JSON-encoded value
func (m *StringToStringsMap) Scan(value interface{}) error {
if value == nil {
return nil
}
b, ok := value.([]byte)
if !ok {
return errors.New("type assertion to []byte failed")
}
// Unmarshal from json to map[string][]string
var raw internalMap
if err := json.Unmarshal(b, &raw); err != nil {
return err
}
if raw == nil {
*m = nil
return nil
}
scanned := make(StringToStringsMap, len(raw))
for k, v := range raw {
scanned[k] = set.NewStringSet(v...)
}
*m = scanned
return nil
}
// Merge merges map b to map a.
// If:
//
// a contains str_a -> ["a", "b"]
// b contains str_a -> ["b", "c"]
//
// Then after merging:
//
// a contains str_a -> {"a", "b", "c"}
func (m *StringToStringsMap) Merge(b StringToStringsMap) {
if len(b) == 0 {
return
}
if *m == nil {
*m = make(StringToStringsMap)
}
for k, v := range b {
(*m)[k] = (*m)[k].Union(v)
}
}