Skip to content

Commit 378357b

Browse files
committed
添加: 类型检查
1 parent 8e25f82 commit 378357b

34 files changed

+433
-267
lines changed

README.md

+10
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,16 @@
4545

4646
# 迭代历程
4747

48+
* 2018年8月: 第七代导出器,tabtoy v3 大幅简化表格类型及表头展现方式
49+
50+
新增: tabtoy内建数据类型也使用v3导出的结构实现自举
51+
52+
新增: 索引表, 类型表, 数据表。所有表均可实现Sheet,文件之间的合并
53+
54+
修改: 任意表头只有一行,类型由类型表定义
55+
56+
修改: 基于Json的二进制格式,消除格式间差异
57+
4858
* 2016年8月: 第六代导出器,tabtoy v2 调整为以电子表格为中心的方式, 支持v1 90%常用功能
4959

5060
增加: 所有导出文件均为1个文件, 提高加载读取速度

README_v3.md

+11
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,17 @@ go源码导出
2727

2828
# TODO
2929

30+
统一的打印输出
31+
32+
所有Meta功能实现,RepeatCheck
33+
34+
35+
36+
索引代码生成
37+
38+
基于map[string]interface{}的二进制支持
39+
40+
3041
数组的处理: 单元格空时,无论任何情况,导出数组中都没有数值和0填充,除非添加一个特性:强制填充默认值,数组通过多个单元格导出时,默认值为单元格数量
3142

3243
做成SDK,无需导出数据,开发期直接读取电子表格

entry_v3.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"github.com/davyxu/tabtoy/v3"
77
"github.com/davyxu/tabtoy/v3/gen"
88
"github.com/davyxu/tabtoy/v3/gen/gosrc"
9-
"github.com/davyxu/tabtoy/v3/gen/json"
9+
"github.com/davyxu/tabtoy/v3/gen/jsondata"
1010
"github.com/davyxu/tabtoy/v3/helper"
1111
"github.com/davyxu/tabtoy/v3/model"
1212
"os"
@@ -24,7 +24,7 @@ var (
2424

2525
v3GenList = []V3GenEntry{
2626
{gosrc.Generate, paramGoOut},
27-
{json.Generate, paramJsonOut},
27+
{jsondata.Generate, paramJsonOut},
2828
}
2929
)
3030

v3/checker/entry.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package checker
2+
3+
import "github.com/davyxu/tabtoy/v3/model"
4+
5+
func Check(list *model.DataTableList) {
6+
7+
//for _, tab := range list.Data {
8+
//
9+
//}
10+
}

v3/checker/types.go

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package checker
2+
3+
import (
4+
"github.com/davyxu/tabtoy/v3/helper"
5+
"github.com/davyxu/tabtoy/v3/model"
6+
"github.com/davyxu/tabtoy/v3/table"
7+
)
8+
9+
func CheckTypes(tab *model.DataTable, types *model.TypeTable) {
10+
11+
for col, headerType := range tab.HeaderFields {
12+
13+
// 原始类型检查
14+
if !table.PrimitiveExists(headerType.FieldType) &&
15+
!types.ObjectExists(headerType.FieldType) { // 对象检查
16+
17+
raw := tab.RawHeader[col]
18+
19+
helper.ReportError("UnknownFieldType", raw.String())
20+
}
21+
}
22+
23+
}

v3/compile.go

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package v3
22

33
import (
4+
"github.com/davyxu/tabtoy/v3/checker"
45
"github.com/davyxu/tabtoy/v3/helper"
56
"github.com/davyxu/tabtoy/v3/model"
67
"github.com/davyxu/tabtoy/v3/table"
@@ -68,7 +69,10 @@ func Compile(globals *model.Globals, indexGetter FileGetter) (ret error) {
6869
}
6970

7071
for _, tab := range tablist {
71-
ResolveHeaderFields(tab, tab.HeaderType, globals.Symbols)
72+
ResolveHeaderFields(tab, tab.HeaderType, globals.Types)
73+
74+
checker.CheckTypes(tab, globals.Types)
75+
7276
dataList.AddDataTable(tab)
7377
}
7478

@@ -88,24 +92,27 @@ func Compile(globals *model.Globals, indexGetter FileGetter) (ret error) {
8892
}
8993

9094
for _, tab := range tablist {
91-
ResolveHeaderFields(tab, "TableKeyValue", globals.Symbols)
95+
ResolveHeaderFields(tab, "TableKeyValue", globals.Types)
96+
97+
checker.CheckTypes(tab, globals.Types)
98+
9299
kvList.AddDataTable(tab)
93100
}
94101
}
95102
}
96103

97104
// 合并所有的KV表行
98105
var mergedKV model.DataTableList
99-
mergeData(&kvList, &mergedKV, globals.Symbols)
106+
mergeData(&kvList, &mergedKV, globals.Types)
100107

101108
// 完整KV表转置为普通数据表
102109
for _, kvtab := range mergedKV.Data {
103-
ResolveHeaderFields(kvtab, kvtab.HeaderType, globals.Symbols)
104-
dataList.AddDataTable(transposeKVtoData(globals.Symbols, kvtab))
110+
ResolveHeaderFields(kvtab, kvtab.HeaderType, globals.Types)
111+
dataList.AddDataTable(transposeKVtoData(globals.Types, kvtab))
105112
}
106113

107114
// 合并所有的数据表
108-
mergeData(&dataList, &globals.DataTableList, globals.Symbols)
115+
mergeData(&dataList, &globals.DataTableList, globals.Types)
109116

110117
return nil
111118
}

v3/gen/gosrc/text.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,25 @@ const templateText = `// Generated by github.com/davyxu/tabtoy
66
// Version: {{.Version}}
77
package {{.PackageName}}
88
9-
{{range $sn, $objName := $.Symbols.EnumNames}}
9+
{{range $sn, $objName := $.Types.EnumNames}}
1010
type {{$objName}} int32
11-
const ( {{range $fi,$field := $.Symbols.Fields $objName}}
11+
const ( {{range $fi,$field := $.Types.AllFieldByName $objName}}
1212
{{$objName}}_{{$field.FieldName}} = {{$field.Value}} // {{$field.Name}} {{end}}
1313
)
1414
1515
var (
16-
{{$objName}}MapperValueByName = map[string]int32{ {{range $fi,$field := $.Symbols.Fields $objName}}
16+
{{$objName}}MapperValueByName = map[string]int32{ {{range $fi,$field := $.Types.AllFieldByName $objName}}
1717
"{{$field.FieldName}}": {{$field.Value}}, // {{$field.Name}} {{end}}
1818
}
1919
20-
{{$objName}}MapperNameByValue = map[int32]string{ {{range $fi,$field := $.Symbols.Fields $objName}}
20+
{{$objName}}MapperNameByValue = map[int32]string{ {{range $fi,$field := $.Types.AllFieldByName $objName}}
2121
{{$field.Value}}: "{{$field.FieldName}}", // {{$field.Name}} {{end}}
2222
}
2323
)
2424
{{end}}
2525
26-
{{range $sn, $objName := $.Symbols.StructNames}}
27-
type {{$objName}} struct{ {{range $fi,$field := $.Symbols.Fields $objName}}
26+
{{range $sn, $objName := $.Types.StructNames}}
27+
type {{$objName}} struct{ {{range $fi,$field := $.Types.AllFieldByName $objName}}
2828
{{$field.FieldName}} {{LanguageType $field "go"}} {{GoTabTag $field}} {{end}}
2929
}
3030
{{end}}

v3/gen/json/func.go v3/gen/jsondata/func.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package json
1+
package jsondata
22

33
import (
44
"github.com/davyxu/tabtoy/util"
@@ -14,8 +14,8 @@ func wrapSingleValue(globals *model.Globals, valueType *table.TableField, value
1414
switch {
1515
case valueType.FieldType == "string": // 字符串
1616
return util.StringEscape(value)
17-
case globals.Symbols.IsEnumKind(valueType.FieldType): // 枚举
18-
return globals.Symbols.ResolveEnumValue(valueType.FieldType, value)
17+
case globals.Types.IsEnumKind(valueType.FieldType): // 枚举
18+
return globals.Types.ResolveEnumValue(valueType.FieldType, value)
1919
case valueType.FieldType == "bool":
2020

2121
switch value {

v3/gen/json/gen.go v3/gen/jsondata/gen.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package json
1+
package jsondata
22

33
import (
44
"github.com/davyxu/protoplus/codegen"

v3/gen/json/text.go v3/gen/jsondata/text.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package json
1+
package jsondata
22

33
// 报错行号+3
44
const templateText = `{

v3/header.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ func loadheader(sheet *xlsx.Sheet, tab *model.DataTable) {
3030
tab.RawHeader = headerRow
3131
}
3232

33-
func ResolveHeaderFields(tab *model.DataTable, tableObjectType string, symbols *model.SymbolTable) {
33+
func ResolveHeaderFields(tab *model.DataTable, tableObjectType string, symbols *model.TypeTable) {
3434

3535
tab.OriginalHeaderType = tableObjectType
3636
for _, cell := range tab.RawHeader {
3737

38-
tf := symbols.FindField(tableObjectType, cell.Value)
38+
tf := symbols.FieldByName(tableObjectType, cell.Value)
3939
if tf == nil {
4040
helper.ReportError("HeaderFieldNotDefined", cell.String())
4141
}

v3/helper/error.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type ErrorObject struct {
1515

1616
func getErrorDesc(id string) string {
1717

18-
errobj := table.BuiltinConfig.GetKeyValue_ErrorID()
18+
errobj := table.CoreConfig.GetKeyValue_ErrorID()
1919
tobj := reflect.TypeOf(errobj).Elem()
2020
vobj := reflect.ValueOf(errobj).Elem()
2121

v3/helper/resolverow.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func matchField(objType reflect.Type, header string) int {
2020
}
2121

2222
// 将一行数据解析为具体的类型
23-
func ParseRow(ret interface{}, tab *model.DataTable, row int, symbols *model.SymbolTable) {
23+
func ParseRow(ret interface{}, tab *model.DataTable, row int, symbols *model.TypeTable) {
2424

2525
vobj := reflect.ValueOf(ret).Elem()
2626

v3/helper/strtovalue.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func strToPrimitive(str string, value interface{}) (error, bool) {
8080
return nil, true
8181
}
8282

83-
func StringToValue(str string, value interface{}, tf *table.TableField, symbols *model.SymbolTable) error {
83+
func StringToValue(str string, value interface{}, tf *table.TableField, symbols *model.TypeTable) error {
8484

8585
err, handled := strToPrimitive(str, value)
8686
if err != nil || handled {

v3/merge.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
// 将不同文件/Sheet/KV转换的表,按照表头类型合并数据输出
10-
func mergeData(inputList, outputList *model.DataTableList, symbols *model.SymbolTable) {
10+
func mergeData(inputList, outputList *model.DataTableList, symbols *model.TypeTable) {
1111

1212
for _, inputTab := range inputList.Data {
1313

@@ -25,7 +25,7 @@ func mergeData(inputList, outputList *model.DataTableList, symbols *model.Symbol
2525
var headerFields []*table.TableField
2626

2727
// 原始表头类型为解析
28-
headerFields = symbols.Fields(inputTab.OriginalHeaderType)
28+
headerFields = symbols.AllFieldByName(inputTab.OriginalHeaderType)
2929

3030
if headerFields == nil {
3131
panic("表头找不到!" + inputTab.OriginalHeaderType)
@@ -49,7 +49,7 @@ func mergeData(inputList, outputList *model.DataTableList, symbols *model.Symbol
4949
headerField := inputTab.HeaderFields[col]
5050

5151
// 用输入的表头名在输出的表头中找
52-
_, OutputCol := outputTab.HeaderFieldByName(headerField.FieldName)
52+
_, OutputCol := outputTab.GetTypeByName(headerField.FieldName)
5353

5454
if headerField.IsArray() {
5555

v3/model/datatab.go

+19-27
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,6 @@ type DataTable struct {
3535
HeaderFields []*table.TableField // 列索引
3636
}
3737

38-
// 根据列头找到该行对应的值
39-
func (self *DataTable) GetValueByName(row int, name string) (Cell, *table.TableField) {
40-
41-
for col, tf := range self.HeaderFields {
42-
if tf.Name == name || tf.FieldName == name {
43-
return self.Rows[row][col], tf
44-
}
45-
}
46-
47-
return Cell{}, nil
48-
}
49-
5038
// 代码生成专用
5139
func (self *DataTable) GetValue(row, col int) string {
5240

@@ -58,16 +46,7 @@ func (self *DataTable) GetType(col int) *table.TableField {
5846
return self.HeaderFields[col]
5947
}
6048

61-
func (self *DataTable) RowCount() int {
62-
return len(self.Rows)
63-
}
64-
65-
// 添加表头类型
66-
func (self *DataTable) AddHeaderField(types *table.TableField) {
67-
self.HeaderFields = append(self.HeaderFields, types)
68-
}
69-
70-
func (self *DataTable) HeaderFieldByName(name string) (*table.TableField, int) {
49+
func (self *DataTable) GetTypeByName(name string) (*table.TableField, int) {
7150

7251
if name == "" {
7352
return nil, -1
@@ -82,17 +61,30 @@ func (self *DataTable) HeaderFieldByName(name string) (*table.TableField, int) {
8261
return nil, -1
8362
}
8463

64+
// 根据列头找到该行对应的值
65+
func (self *DataTable) GetValueByName(row int, name string) (Cell, *table.TableField) {
66+
67+
hf, col := self.GetTypeByName(name)
68+
69+
if hf == nil {
70+
return Cell{}, nil
71+
}
72+
73+
return self.Rows[row][col], hf
74+
75+
}
76+
77+
// 添加表头类型
78+
func (self *DataTable) AddHeaderField(types *table.TableField) {
79+
self.HeaderFields = append(self.HeaderFields, types)
80+
}
81+
8582
// 添加行数据
8683
func (self *DataTable) AddRow(row DataRow) {
8784

8885
self.Rows = append(self.Rows, row)
8986
}
9087

91-
// 获取一整行数据
92-
func (self *DataTable) GetDataRow(row int) DataRow {
93-
return self.Rows[row]
94-
}
95-
9688
func NewDataTable() *DataTable {
9789
return &DataTable{}
9890
}

v3/model/globals.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ type Globals struct {
1313
CombineStructName string // 包含最终表所有数据的根结构
1414
Para bool // 并发读取文件
1515

16-
Symbols *SymbolTable // 类型及符号
16+
Types *TypeTable // 类型及符号
1717

1818
IndexList []*table.TablePragma
1919

20-
DataTableList // 字符串格式的数据
20+
DataTableList // 字符串格式的数据表
2121
}
2222

2323
func (self *Globals) KeyValueTypeNames() (ret []string) {
@@ -34,6 +34,6 @@ func (self *Globals) KeyValueTypeNames() (ret []string) {
3434

3535
func NewGlobals() *Globals {
3636
return &Globals{
37-
Symbols: NewSymbolTable(),
37+
Types: NewSymbolTable(),
3838
}
3939
}

0 commit comments

Comments
 (0)