-
Notifications
You must be signed in to change notification settings - Fork 1
/
build_options.go
89 lines (75 loc) · 1.74 KB
/
build_options.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
package common
import (
"encoding/json"
"fmt"
"strings"
"gitlab.com/gitlab-org/gitlab-ci-multi-runner/helpers"
)
type BuildOptions map[string]interface{}
func (m *BuildOptions) Get(keys ...string) (interface{}, bool) {
return helpers.GetMapKey(*m, keys...)
}
func (m *BuildOptions) GetSubOptions(keys ...string) (result BuildOptions, ok bool) {
value, ok := helpers.GetMapKey(*m, keys...)
if ok {
result, ok = value.(map[string]interface{})
}
return
}
func (m *BuildOptions) GetString(keys ...string) (result string, ok bool) {
value, ok := helpers.GetMapKey(*m, keys...)
if ok {
result, ok = value.(string)
}
return
}
func (m *BuildOptions) Decode(result interface{}, keys ...string) error {
value, ok := m.Get(keys...)
if !ok {
return fmt.Errorf("key not found %v", strings.Join(keys, "."))
}
data, err := json.Marshal(value)
if err != nil {
return err
}
return json.Unmarshal(data, result)
}
func convertMapToStringMap(in interface{}) (out interface{}, err error) {
mapString, ok := in.(map[string]interface{})
if ok {
for k, v := range mapString {
mapString[k], err = convertMapToStringMap(v)
if err != nil {
return
}
}
return mapString, nil
}
mapInterface, ok := in.(map[interface{}]interface{})
if ok {
mapString := make(map[string]interface{})
for k, v := range mapInterface {
key, ok := k.(string)
if !ok {
return nil, fmt.Errorf("failed to convert %v to string", k)
}
mapString[key], err = convertMapToStringMap(v)
if err != nil {
return
}
}
return mapString, nil
}
return in, nil
}
func (m *BuildOptions) Sanitize() (err error) {
n := make(BuildOptions)
for k, v := range *m {
n[k], err = convertMapToStringMap(v)
if err != nil {
return
}
}
*m = n
return
}