Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 44 additions & 8 deletions internal/protogen/exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,10 +200,10 @@ func (x *sheetExporter) exportStruct() error {
x.g.P(" option (tableau.struct) = {", marshalToText(opts), "};")
x.g.P("")
// generate the fields
depth := 1
for i, field := range x.ws.Fields {
tagid := i + 1
if err := x.exportField(depth, tagid, field, x.ws.Name); err != nil {
err := x.exportField(1, tagid, field, x.ws.Name)
if err != nil {
return err
}
}
Expand Down Expand Up @@ -260,10 +260,9 @@ func (x *sheetExporter) exportUnion() error {
}
x.g.P(" message ", strings.TrimSpace(msgField.Name), " {")
// generate the fields
depth := 2
tagid := 1
for _, field := range msgField.Fields {
if err := x.exportField(depth, tagid, field, msgField.Name); err != nil {
if err := x.exportField(2, tagid, field, msgField.Name); err != nil {
return err
}
cross := int(field.GetOptions().GetProp().GetCross())
Expand All @@ -290,11 +289,12 @@ func (x *sheetExporter) exportMessager() error {
x.g.P("message ", x.ws.Name, " {")
x.g.P(" option (tableau.worksheet) = {", marshalToText(x.ws.Options), "};")
x.g.P("")
// generate the tagids
tagids := genTagids(x.ws.Fields)
// generate the fields
depth := 1
for i, field := range x.ws.Fields {
tagid := i + 1
if err := x.exportField(depth, tagid, field, x.ws.Name); err != nil {
tagid := tagids[i]
if err := x.exportField(1, tagid, field, x.ws.Name); err != nil {
return err
}
}
Expand Down Expand Up @@ -365,8 +365,10 @@ func (x *sheetExporter) exportField(depth int, tagid int, field *internalpb.Fiel

// x.g.P("")
x.g.P(printer.Indent(depth), "message ", typeName, " {")
// generate the tagids
tagids := genTagids(field.Fields)
for i, f := range field.Fields {
tagid := i + 1
tagid := tagids[i]
if err := x.exportField(depth+1, tagid, f, nestedMsgName); err != nil {
return err
}
Expand All @@ -382,6 +384,7 @@ func genFieldOptionsString(opts *tableaupb.FieldOptions) string {
if opts.Prop != nil {
jsonName = opts.Prop.JsonName
opts.Prop.JsonName = ""
opts.Prop.Number = 0

// set nil if field prop is empty
if IsEmptyFieldProp(opts.Prop) {
Expand Down Expand Up @@ -424,3 +427,36 @@ func isSameFieldMessageType(left, right *internalpb.Field) bool {
}
return false
}

func genTagids(fields []*internalpb.Field) []int {
tagids := make([]int, 0, len(fields))
occupiedTagids := make(map[int]bool, len(fields))
for i, field := range fields {
if i == 0 {
tagids = append(tagids, 1)
continue
}
number := int(field.Options.GetProp().GetNumber())
if number > 1 && !occupiedTagids[number] {
tagids = append(tagids, number)
occupiedTagids[number] = true
} else {
tagids = append(tagids, 0)
}
}
autogenTagid := 1
nextTagid := func() int {
for {
autogenTagid++
if !occupiedTagids[autogenTagid] {
return autogenTagid
}
}
}
for i, tagid := range tagids {
if tagid == 0 {
tagids[i] = nextTagid()
}
}
return tagids
}
4 changes: 4 additions & 0 deletions internal/protogen/field_prop.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ func ExtractMapFieldProp(prop *tableaupb.FieldProp) *tableaupb.FieldProp {
Patch: prop.Patch,
Sep: prop.Sep,
Subsep: prop.Subsep,
Number: prop.Number,
}
if IsEmptyFieldProp(p) {
return nil
Expand All @@ -50,6 +51,7 @@ func ExtractListFieldProp(prop *tableaupb.FieldProp, isScalarList bool) *tableau
Sep: prop.Sep,
Subsep: prop.Subsep,
Cross: prop.Cross,
Number: prop.Number,
}
if isScalarList {
p.Range = prop.Range
Expand All @@ -75,6 +77,7 @@ func ExtractStructFieldProp(prop *tableaupb.FieldProp) *tableaupb.FieldProp {
Patch: prop.Patch,
Sep: prop.Sep,
Subsep: prop.Subsep,
Number: prop.Number,
}
if IsEmptyFieldProp(p) {
return nil
Expand All @@ -99,6 +102,7 @@ func ExtractScalarFieldProp(prop *tableaupb.FieldProp) *tableaupb.FieldProp {
Optional: prop.Optional,
Patch: prop.Patch,
Pattern: prop.Pattern,
Number: prop.Number,
}
if IsEmptyFieldProp(p) {
return nil
Expand Down
13 changes: 11 additions & 2 deletions proto/tableau/protobuf/tableau.proto
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@ message OneofOptions {

message WorkbookOptions {
// filename with path, e.g.: "relative/path/BookName.suffix" (slash path)
string name = 1;
string name = 1;
// book alias without suffix, e.g.: "BookAlias"
string alias = 2;
string alias = 2;
// Exact row number of column name definition at a worksheet.
//
// Default: 1.
Expand Down Expand Up @@ -344,6 +344,15 @@ message FieldProp {
//
// TODO: use cases for more field types.
string pattern = 16;
// Specify field number (unique numbered tag).
// All fields without numbers specified will use a sequence starting from 1 by default,
// and will not reuse explicitly specified field numbers.
// The first field of a message must occupy number 1 by default, and specifying other
// field number as 1 makes no sense since this number is reserved for the first field.
// If you specify same field number on multiple fields, only the first of them works.
//
// Refer to [protobuf: Assigning Field Numbers](https://protobuf.dev/programming-guides/proto3/#assigning)
int32 number = 17;
}

// Layout of list and map.
Expand Down
Loading
Loading