forked from davyxu/tabtoy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tab_kv.go
76 lines (54 loc) · 1.91 KB
/
tab_kv.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
package compiler
import (
"github.com/adamluo159/tabtoy/v3/model"
"github.com/adamluo159/tabtoy/v3/report"
"strings"
)
func transposeKVtoData(symbols *model.TypeTable, kvtab *model.DataTable) (ret *model.DataTable) {
ret = model.NewDataTable()
ret.HeaderType = kvtab.HeaderType
ret.OriginalHeaderType = kvtab.HeaderType
ret.FileName = kvtab.FileName
ret.SheetName = kvtab.SheetName
// 添加表头
ret.AddRow()
// 添加数据行
ret.AddRow()
// 遍历KV表的每一行
for row := 1; row < len(kvtab.Rows); row++ {
fieldName := kvtab.GetValueByName(row, "字段名")
fieldType := kvtab.GetValueByName(row, "字段类型")
name := kvtab.GetValueByName(row, "标识名")
arraySplitter := kvtab.GetValueByName(row, "数组切割")
tags := kvtab.GetValueByName(row, "标记")
var tf model.TypeDefine
tf.Kind = model.TypeUsage_HeaderStruct
tf.ObjectType = kvtab.HeaderType
tf.Name = name.Value
if !model.PrimitiveExists(fieldType.Value) && !symbols.ObjectExists(fieldType.Value) { // 对象检查
report.ReportError("UnknownFieldType", fieldType.Value, fieldType.String())
}
tf.FieldName = fieldName.Value
tf.FieldType = fieldType.Value
tf.ArraySplitter = arraySplitter.Value
// 将KV表的Tags转换过去
if tags != nil && tags.Value != "" {
tagsType := kvtab.HeaderByName("标记")
tf.Tags = strings.Split(tags.Value, tagsType.TypeInfo.ArraySplitter)
}
if symbols.FieldByName(tf.ObjectType, tf.FieldName) != nil {
report.ReportError("DuplicateKVField", fieldName.String())
}
symbols.AddField(&tf, kvtab, row)
// 输出表的表头原始数据
headerCell := ret.AddCell(0)
headerCell.Value = fieldName.Value
header := ret.MustGetHeader(headerCell.Col)
header.Cell.Value = fieldName.Value
header.TypeInfo = &tf
inputValueCell := kvtab.GetValueByName(row, "值")
outputValueCell := ret.AddCell(1)
outputValueCell.CopyFrom(inputValueCell)
}
return
}