definition.go 4.4 KB
Newer Older
1 2 3 4
package gen

import (
	"github.com/easysoft/zendata/src/model"
5
	constant "github.com/easysoft/zendata/src/utils/const"
aaronchen2k2k's avatar
i118  
aaronchen2k2k 已提交
6
	i118Utils "github.com/easysoft/zendata/src/utils/i118"
7
	logUtils "github.com/easysoft/zendata/src/utils/log"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
8
	"gopkg.in/yaml.v3"
9
	"io/ioutil"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
10
	"strings"
11 12
)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
13
func LoadConfigDef(defaultFile, configFile string, fieldsToExport *[]string) model.DefData {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
14
	defaultDef := model.DefData{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
15
	configDef := model.DefData{}
16

aaronchen2k2k's avatar
aaronchen2k2k 已提交
17
	// load defaultDef
aaronchen2k2k's avatar
aaronchen2k2k 已提交
18 19
	if defaultFile != "" {
		defaultContent, err := ioutil.ReadFile(defaultFile)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
20
		defaultContent = ReplaceSpecialChars(defaultContent)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
21 22 23 24 25 26 27 28 29
		if err != nil {
			logUtils.Screen(i118Utils.I118Prt.Sprintf("fail_to_read_file", defaultFile))
			return defaultDef
		}
		err = yaml.Unmarshal(defaultContent, &defaultDef)
		if err != nil {
			logUtils.Screen(i118Utils.I118Prt.Sprintf("fail_to_read_file", defaultFile))
			return defaultDef
		}
30 31
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
32 33
	// load configDef
	yamlContent, err := ioutil.ReadFile(configFile)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
34
	yamlContent = ReplaceSpecialChars(yamlContent)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
35
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
36 37
		logUtils.Screen(i118Utils.I118Prt.Sprintf("fail_to_read_file", configFile))
		return configDef
aaronchen2k2k's avatar
aaronchen2k2k 已提交
38
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
39
	err = yaml.Unmarshal(yamlContent, &configDef)
40
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
41 42
		logUtils.Screen(i118Utils.I118Prt.Sprintf("fail_to_parse_file", configFile))
		return configDef
aaronchen2k2k's avatar
aaronchen2k2k 已提交
43 44
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
45
	// use all fields as default
46
	if len(*fieldsToExport) == 0 {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
47
		for _, field := range configDef.Fields {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48 49 50 51
			*fieldsToExport = append(*fieldsToExport, field.Field)
		}
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
52 53
	mergerDefine(&defaultDef, &configDef)
	orderFields(&defaultDef, *fieldsToExport)
54

aaronchen2k2k's avatar
aaronchen2k2k 已提交
55 56 57
	return defaultDef
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
58
func mergerDefine(defaultDef, configDef *model.DefData) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
59
	defaultFieldMap := map[string]*model.DefField{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
60
	configFieldMap := map[string]*model.DefField{}
61
	sortedKeys := make([]string, 0)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
62

63
	for i := range defaultDef.Fields {
64
		CreatePathToFieldMap(&defaultDef.Fields[i], defaultFieldMap, nil)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
65 66
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
67 68
	for i := range configDef.Fields {
		CreatePathToFieldMap(&configDef.Fields[i], configFieldMap, &sortedKeys)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
69 70
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
71 72
	// overwrite
	for path, field := range configFieldMap {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
73 74 75
		parent, exist := defaultFieldMap[path]
		if exist {
			CopyField(*field, parent)
76
			defaultFieldMap[path] = parent
aaronchen2k2k's avatar
aaronchen2k2k 已提交
77
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
78
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
79

aaronchen2k2k's avatar
aaronchen2k2k 已提交
80
	// append
81
	for _, key := range sortedKeys {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
82 83
		field := configFieldMap[key]
		if strings.Index(field.Path, "~~") > -1 { continue } // ignore no-top fields
aaronchen2k2k's avatar
aaronchen2k2k 已提交
84 85 86 87 88 89 90 91

		_, exist := defaultFieldMap[field.Path]
		if !exist {
			defaultDef.Fields = append(defaultDef.Fields, *field)
		}
	}
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105
func orderFields(defaultDef *model.DefData, fieldsToExport []string) {
	mp := map[string]model.DefField{}
	for _, field := range defaultDef.Fields {
		mp[field.Field] = field
	}

	fields := make([]model.DefField, 0)
	for _, fieldName := range fieldsToExport {
		fields = append(fields, mp[fieldName])
	}

	defaultDef.Fields = fields
}

106
func CreatePathToFieldMap(field *model.DefField, mp map[string]*model.DefField, keys *[]string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
107 108 109 110
	if field.Path == "" { // root
		field.Path = field.Field
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
111 112 113 114 115 116 117 118
	path := field.Path
	//logUtils.Screen(path + " -> " + field.Field)
	mp[path] = field

	if keys != nil {
		*keys = append(*keys, path)
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
119
	if len(field.Fields) > 0 {
120 121
		for i := range field.Fields {
			field.Fields[i].Path = field.Path + "~~" + field.Fields[i].Field
aaronchen2k2k's avatar
aaronchen2k2k 已提交
122

123
			CreatePathToFieldMap(&field.Fields[i], mp, keys)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
124 125 126 127 128 129
		}
	}
}

func CopyField(child model.DefField, parent *model.DefField) {
	if child.Note != "" {
130
		(*parent).Note = child.Note
aaronchen2k2k's avatar
aaronchen2k2k 已提交
131
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
132 133 134
	if child.Range != "" {
		(*parent).Range = child.Range
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
135
	if child.Prefix != "" {
136
		(*parent).Prefix = child.Prefix
aaronchen2k2k's avatar
aaronchen2k2k 已提交
137 138
	}
	if child.Postfix != "" {
139
		(*parent).Postfix = child.Postfix
aaronchen2k2k's avatar
aaronchen2k2k 已提交
140 141
	}
	if child.Loop != 0 {
142
		(*parent).Loop = child.Loop
aaronchen2k2k's avatar
aaronchen2k2k 已提交
143 144
	}
	if child.Loopfix != "" {
145
		(*parent).Loopfix = child.Loopfix
aaronchen2k2k's avatar
aaronchen2k2k 已提交
146 147
	}
	if child.Format != "" {
148
		(*parent).Format = child.Format
aaronchen2k2k's avatar
aaronchen2k2k 已提交
149 150 151
	}

	if child.From != "" {
152
		(*parent).From = child.From
aaronchen2k2k's avatar
aaronchen2k2k 已提交
153 154
	}
	if child.Select != "" {
155
		(*parent).Select = child.Select
aaronchen2k2k's avatar
aaronchen2k2k 已提交
156 157
	}
	if child.Where != "" {
158
		(*parent).Where = child.Where
aaronchen2k2k's avatar
aaronchen2k2k 已提交
159 160
	}
	if child.Use != "" {
161
		(*parent).Use = child.Use
aaronchen2k2k's avatar
aaronchen2k2k 已提交
162 163 164
	}

	if child.Precision != 0 {
165
		(*parent).Precision = child.Precision
aaronchen2k2k's avatar
aaronchen2k2k 已提交
166
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
167 168
	if child.Width != 0 {
		(*parent).Width = child.Width
aaronchen2k2k's avatar
aaronchen2k2k 已提交
169
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
170
}
171

aaronchen2k2k's avatar
aaronchen2k2k 已提交
172
func ReplaceSpecialChars(bytes []byte) []byte {
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
	str := string(bytes)

	ret := ""
	for _, line := range strings.Split(str, "\n") {
		if strings.Index(strings.TrimSpace(line), "range") == 0 {
			line = strings.ReplaceAll(line,"[", string(constant.LeftChar))
			line = strings.ReplaceAll(line,"]", string(constant.RightChar))
		}

		ret += line + "\n"
	}

	return []byte(ret)
}