/
parser.go
44 lines (40 loc) · 1011 Bytes
/
parser.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
package main
import (
"errors"
"github.com/tealeg/xlsx"
)
func parseField(row *xlsx.Row, column *column) (*Field, error) {
for index, cell := range row.Cells {
if cell.String() == column.Title {
ctype, err := TypeOf(column.Type)
if err != nil {
return nil, err
}
return NewField(column.Name, column.Title, ctype, index), nil
}
}
return nil, errors.New("Unknow column.")
}
func parseFieldTable(name string, row *xlsx.Row, columns []column) (*FieldTable, error) {
var keys, fields []*Field
fieldmap := make(map[string]*Field)
for _, column := range columns {
if _, ok := fieldmap[column.Name]; ok {
return nil, errors.New("repeat column.")
}
field, err := parseField(row, &column)
if err != nil {
return nil, err
}
if column.Key {
keys = append(keys, field)
} else {
fields = append(fields, field)
}
fieldmap[column.Name] = field
}
if len(keys) == 0 {
return nil, errors.New("cannot find key.")
}
return NewFieldTable(name, keys, fields), nil
}