generator.go 5.7 KB
Newer Older
aaronchen2k2k's avatar
aaronchen2k2k 已提交
1 2 3
package gen

import (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
4
	"fmt"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
5 6
	"github.com/easysoft/zendata/src/model"
	constant "github.com/easysoft/zendata/src/utils/const"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
7
	fileUtils "github.com/easysoft/zendata/src/utils/file"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
8
	stringUtils "github.com/easysoft/zendata/src/utils/string"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
9
	"github.com/easysoft/zendata/src/utils/vari"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
10
	"github.com/mattn/go-runewidth"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
11
	"strconv"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
12 13 14
	"strings"
)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
15
func GenerateForDefinition(defaultFile, configFile string, fieldsToExport *[]string, total int) ([][]string, []bool) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
16 17 18 19 20
	vari.DefaultDir = fileUtils.GetAbsDir(defaultFile)
	vari.ConfigDir = fileUtils.GetAbsDir(configFile)

	vari.Def = LoadConfigDef(defaultFile, configFile, fieldsToExport)
	vari.Res = LoadResDef(*fieldsToExport)
21

aaronchen2k2k's avatar
aaronchen2k2k 已提交
22 23
	fieldNameToValues := map[string][]string{}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
24 25
	colTypes := make([]bool, 0)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
26
	// 为每个field生成值列表
aaronchen2k2k's avatar
aaronchen2k2k 已提交
27
	for index, field := range vari.Def.Fields {
28
		if !stringUtils.FindInArr(field.Field, *fieldsToExport) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
29 30
			continue
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
31

32
		values := GenerateForField(&field, total, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
33
		vari.Def.Fields[index].Precision = field.Precision
aaronchen2k2k's avatar
aaronchen2k2k 已提交
34

aaronchen2k2k's avatar
aaronchen2k2k 已提交
35
		fieldNameToValues[field.Field] = values
aaronchen2k2k's avatar
aaronchen2k2k 已提交
36
		colTypes = append(colTypes, field.IsNumb)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
37 38
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
39
	// 生成指定数量行的数据
aaronchen2k2k's avatar
aaronchen2k2k 已提交
40 41
	rows := make([][]string, 0)
	for i := 0; i < total; i++ {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
42
		for _, field := range vari.Def.Fields {
43
			if !stringUtils.FindInArr(field.Field, *fieldsToExport) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
44 45
				continue
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
46

aaronchen2k2k's avatar
aaronchen2k2k 已提交
47
			values := fieldNameToValues[field.Field]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48
			fieldVal := values[i % len(values)]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
49
			if len(rows) == i { rows = append(rows, make([]string, 0)) }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
50
			rows[i] = append(rows[i], fieldVal)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
51
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
52
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
53

aaronchen2k2k's avatar
aaronchen2k2k 已提交
54
	return rows, colTypes
aaronchen2k2k's avatar
aaronchen2k2k 已提交
55 56
}

57
func GenerateForField(field *model.DefField, total int, withFix bool) []string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
58 59
	values := make([]string, 0)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
60
	if len(field.Fields) > 0 { // sub fields
aaronchen2k2k's avatar
aaronchen2k2k 已提交
61
		arr := make([][]string, 0) // 2 dimension arr for child, [ [a,b,c], [1,2,3] ]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
62
		for _, child := range field.Fields {
63
			childValues := GenerateForField(&child, total, withFix)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
64 65 66 67 68 69
			arr = append(arr, childValues)
		}

		for i := 0; i < total; i++ {
			concat := ""
			for _, row := range arr {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
70
				concat = concat + row[i] // get one item from each child, grouped as a1 or b2
aaronchen2k2k's avatar
aaronchen2k2k 已提交
71 72
			}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
73 74
			// should be done by calling LoopSubFields func as below, so disable this line
			//concat = field.Prefix + concat + field.Postfix
aaronchen2k2k's avatar
aaronchen2k2k 已提交
75 76
			values = append(values, concat)
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
77
		values = LoopSubFields(field, values, total, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
78

aaronchen2k2k's avatar
aaronchen2k2k 已提交
79
	} else if field.From != "" { // refer to res
80

aaronchen2k2k's avatar
aaronchen2k2k 已提交
81
		if field.Use != "" { // refer to instance
82 83 84 85
			if field.Use == "privateIP" {
				fmt.Println("")
			}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
86
			groupValues := vari.Res[field.From]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
87 88
			groups := strings.Split(field.Use, ",")
			for _, group := range groups {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
89 90 91 92 93 94 95
				if group == "all" {
					for _, arr := range groupValues { // add all
						values = append(values, arr...)
					}
				} else {
					values = append(values, groupValues[group]...)
				}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
96
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
97 98
		} else if field.Select != "" { // refer to excel
			groupValues := vari.Res[field.From]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
99 100
			slct := field.Select
			values = append(values, groupValues[slct]...)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
101 102
		}

103
		values = LoopSubFields(field, values, total, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
104

aaronchen2k2k's avatar
aaronchen2k2k 已提交
105 106 107
	} else if field.Config != "" { // refer to another define
		groupValues := vari.Res[field.Config]
		values = append(values, groupValues["all"]...)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
108
	} else { // basic field
aaronchen2k2k's avatar
aaronchen2k2k 已提交
109
		values = GenerateFieldItemsFromDefinition(field)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
110 111 112 113
	}

	return values
}
114

aaronchen2k2k's avatar
aaronchen2k2k 已提交
115
func GenerateFieldItemsFromDefinition(field *model.DefField) []string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
116 117
	if field.Loop == 0 {field.Loop = 1}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
118 119
	values := make([]string, 0)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
120
	fieldValue := GenerateList(field)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
121 122 123 124 125

	index := 0
	count := 0
	for {
		// 处理格式、前后缀、loop等
aaronchen2k2k's avatar
aaronchen2k2k 已提交
126
		str := GenerateFieldValWithFix(*field, fieldValue, &index, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
127 128 129
		values = append(values, str)

		count++
aaronchen2k2k's avatar
aaronchen2k2k 已提交
130
		if count >= constant.Total {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
131 132 133 134 135 136 137
			break
		}
	}

	return values
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
138
func GenerateFieldVal(field model.DefField, fieldValue model.FieldValue, index *int) string {
139
	str := ""
140

aaronchen2k2k's avatar
aaronchen2k2k 已提交
141 142
	// 叶节点
	idx := *index % len(fieldValue.Values)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
143
	val := fieldValue.Values[idx]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
144
	str = GetFieldValStr(field, val)
145

aaronchen2k2k's avatar
aaronchen2k2k 已提交
146
	return str
147 148
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
149
func GetFieldValStr(field model.DefField, val interface{}) string {
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
150
	str := "n/a"
aaronchen2k2k's avatar
format  
aaronchen2k2k 已提交
151
	success := false
152

aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
153 154
	switch val.(type) {
		case int64:
aaronchen2k2k's avatar
format  
aaronchen2k2k 已提交
155 156 157 158 159 160
			if field.Format != "" {
				str, success = stringUtils.FormatStr(field.Format, val.(int64))
			}
			if !success {
				str = strconv.FormatInt(val.(int64), 10)
			}
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
161 162 163 164 165
		case float64:
			precision := 0
			if field.Precision > 0 {
				precision = field.Precision
			}
aaronchen2k2k's avatar
format  
aaronchen2k2k 已提交
166 167 168 169 170 171
			if field.Format != "" {
				str, success = stringUtils.FormatStr(field.Format, val.(float64))
			}
			if !success {
				str = strconv.FormatFloat(val.(float64), 'f', precision, 64)
			}
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
172 173
		case byte:
			str = string(val.(byte))
aaronchen2k2k's avatar
format  
aaronchen2k2k 已提交
174 175 176 177 178 179
			if field.Format != "" {
				str, success = stringUtils.FormatStr(field.Format, str)
			}
			if !success {
				str = string(val.(byte))
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
180 181
		case string:
			str = val.(string)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
182
			fmt.Sprintf(str)
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
183 184 185 186
		default:
	}

	return str
aaronchen2k2k's avatar
aaronchen2k2k 已提交
187 188
}

189
func LoopSubFields(field *model.DefField, oldValues []string, total int, withFix bool) []string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
190 191 192 193 194 195
	if field.Loop == 0 {field.Loop = 1}

	values := make([]string, 0)
	fieldValue := model.FieldValue{}

	for _, val := range oldValues {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
196
		fieldValue.Values = append(fieldValue.Values, val)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
197 198 199 200 201 202
	}

	index := 0
	count := 0
	for {
		// 处理格式、前后缀、loop等
203
		str := GenerateFieldValWithFix(*field, fieldValue, &index, withFix)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
204 205 206 207 208 209 210 211 212 213 214
		values = append(values, str)

		count++
		if count >= total {
			break
		}
	}

	return values
}

215
func GenerateFieldValWithFix(field model.DefField, fieldValue model.FieldValue, indexOfRow *int, withFix bool) string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
	prefix := field.Prefix
	postfix := field.Postfix

	loopStr := ""
	for j := 0; j < field.Loop; j++ {
		if loopStr != "" {
			loopStr = loopStr + field.Loopfix
		}

		str := GenerateFieldVal(field, fieldValue, indexOfRow)
		loopStr = loopStr + str

		*indexOfRow++
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
231
	if withFix && !vari.Trim {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
232 233 234
		loopStr = prefix + loopStr + postfix
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
235 236
	if field.Width > runewidth.StringWidth(loopStr) {
		loopStr = stringUtils.AddPad(loopStr, field)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
237 238
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
239
	return loopStr
240
}