This repository has been archived by the owner on Aug 3, 2020. It is now read-only.
/
preprocess.go
116 lines (95 loc) · 2.71 KB
/
preprocess.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package parser
import (
"fmt"
"strconv"
"strings"
"github.com/fatih/structs"
"github.com/rancher/rancher-compose-executor/config"
)
func preProcessServiceMap(serviceMap config.RawServiceMap) (config.RawServiceMap, error) {
newServiceMap := make(config.RawServiceMap)
for k, v := range serviceMap {
newServiceMap[k] = make(config.RawService)
for k2, v2 := range v {
if k2 == "environment" || k2 == "labels" {
newServiceMap[k][k2] = preProcess(v2, true)
} else {
newServiceMap[k][k2] = preProcess(v2, false)
}
}
}
return newServiceMap, nil
}
func preProcess(item interface{}, replaceTypes bool) interface{} {
switch typedDatas := item.(type) {
case map[interface{}]interface{}:
newMap := make(map[interface{}]interface{})
for key, value := range typedDatas {
newMap[key] = preProcess(value, replaceTypes)
}
return newMap
case []interface{}:
// newArray := make([]interface{}, 0) will cause golint to complain
var newArray []interface{}
newArray = make([]interface{}, 0)
for _, value := range typedDatas {
newArray = append(newArray, preProcess(value, replaceTypes))
}
return newArray
default:
if replaceTypes && item != nil {
return fmt.Sprint(item)
}
return item
}
}
func TryConvertStringsToInts(serviceMap config.RawServiceMap, fields map[string]bool) (config.RawServiceMap, error) {
newServiceMap := make(config.RawServiceMap)
for k, v := range serviceMap {
newServiceMap[k] = make(config.RawService)
for k2, v2 := range v {
if _, ok := fields[k2]; ok {
newServiceMap[k][k2] = tryConvertStringsToInts(v2, true)
} else {
newServiceMap[k][k2] = tryConvertStringsToInts(v2, false)
}
}
}
return newServiceMap, nil
}
func tryConvertStringsToInts(item interface{}, replaceTypes bool) interface{} {
switch typedDatas := item.(type) {
case map[interface{}]interface{}:
newMap := make(map[interface{}]interface{})
for key, value := range typedDatas {
newMap[key] = tryConvertStringsToInts(value, replaceTypes)
}
return newMap
case []interface{}:
var newArray []interface{}
for _, value := range typedDatas {
newArray = append(newArray, tryConvertStringsToInts(value, replaceTypes))
}
return newArray
case string:
lineAsInteger, err := strconv.Atoi(typedDatas)
if replaceTypes && err == nil {
return lineAsInteger
}
return item
default:
return item
}
}
func getRancherConfigObjects() map[string]bool {
rancherConfig := structs.New(config.RancherConfig{})
fields := map[string]bool{}
for _, field := range rancherConfig.Fields() {
kind := field.Kind().String()
if kind == "struct" || kind == "ptr" || kind == "slice" {
split := strings.Split(field.Tag("yaml"), ",")
fields[split[0]] = true
}
}
return fields
}