forked from davyxu/tabtoy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
header.go
92 lines (67 loc) · 1.92 KB
/
header.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
package compiler
import (
"github.com/davyxu/tabtoy/v3/helper"
"github.com/davyxu/tabtoy/v3/model"
"github.com/davyxu/tabtoy/v3/report"
"strings"
)
func Loadheader(sheet helper.TableSheet, tab *model.DataTable, resolveTableType string, typeTab *model.TypeTable) {
// 读取表头
for col := 0; ; col++ {
headerValue := sheet.GetValue(0, col, nil)
// 空列,终止
if headerValue == "" {
break
}
// 列头带#时,本列忽略
if strings.HasPrefix(headerValue, "#") {
continue
}
header := tab.MustGetHeader(col)
header.Cell.CopyFrom(&model.Cell{
Value: headerValue,
Col: col,
Row: 0,
Table: tab,
})
}
resolveHeaderFields(tab, resolveTableType, typeTab)
checkHeaderTypes(tab, typeTab)
}
func checkHeaderTypes(tab *model.DataTable, typeTab *model.TypeTable) {
for _, header := range tab.Headers {
if header.TypeInfo == nil {
continue
}
// 原始类型检查
if !model.PrimitiveExists(header.TypeInfo.FieldType) &&
!typeTab.ObjectExists(header.TypeInfo.FieldType) { // 对象检查
report.ReportError("UnknownFieldType", header.TypeInfo.FieldType, header.Cell.String())
}
}
}
func headerValueExists(offset int, name string, headers []*model.HeaderField) bool {
for i := offset; i < len(headers); i++ {
if headers[i].Cell.Value == name {
return true
}
}
return false
}
func resolveHeaderFields(tab *model.DataTable, tableObjectType string, typeTab *model.TypeTable) {
tab.OriginalHeaderType = tableObjectType
for index, header := range tab.Headers {
if header.Cell.Value == "" {
continue
}
tf := typeTab.FieldByName(tableObjectType, header.Cell.Value)
if tf == nil {
report.ReportError("HeaderFieldNotDefined", header.Cell.String())
}
if headerValueExists(index+1, header.Cell.Value, tab.Headers) && !tf.IsArray() {
report.ReportError("DuplicateHeaderField", header.Cell.String())
}
// 解析好的类型
header.TypeInfo = tf
}
}