Skip to content

Commit

Permalink
fix size and marshal
Browse files Browse the repository at this point in the history
  • Loading branch information
howardjohn committed Nov 22, 2023
1 parent 0c94c02 commit 2c43b2a
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 12 deletions.
21 changes: 17 additions & 4 deletions features/marshal/marshalto.go
Original file line number Diff line number Diff line change
Expand Up @@ -620,8 +620,11 @@ func (p *marshal) message(message *protogen.Message) {
return message.Fields[i].Desc.Number() < message.Fields[j].Desc.Number()
})

marshalForwardOneOf := func(varname string) {
p.P(`size, err := `, varname, `.`, p.methodMarshalToSizedBuffer(), `(dAtA[:i])`)
marshalForwardOneOf := func(varname ...any) {
l := []any{`size, err := `}
l = append(l, varname...)
l = append(l, `.`, p.methodMarshalToSizedBuffer(), `(dAtA[:i])`)
p.P(l...)
p.P(`if err != nil {`)
p.P(`return 0, err`)
p.P(`}`)
Expand Down Expand Up @@ -655,8 +658,18 @@ func (p *marshal) message(message *protogen.Message) {
oneof := field.Oneof != nil && !field.Oneof.Desc.IsSynthetic()
if oneof {
fieldname := field.Oneof.GoName
if _, ok := oneofs[fieldname]; !ok {
oneofs[fieldname] = struct{}{}
if _, ok := oneofs[fieldname]; ok {
continue
}
oneofs[fieldname] = struct{}{}
if p.IsWellKnownType(message) {
p.P(`switch c := m.`, fieldname, `.(type) {`)
for _, f := range field.Oneof.Fields {
p.P(`case *`, f.GoIdent, `:`)
marshalForwardOneOf(`(*`, p.WellKnownFieldMap(f), `)(c)`)
}
p.P(`}`)
} else {
p.P(`if vtmsg, ok := m.`, fieldname, `.(interface{`)
p.P(p.methodMarshalToSizedBuffer(), ` ([]byte) (int, error)`)
p.P(`}); ok {`)
Expand Down
16 changes: 14 additions & 2 deletions features/size/size.go
Original file line number Diff line number Diff line change
Expand Up @@ -305,8 +305,20 @@ func (p *size) message(message *protogen.Message) {
p.field(false, field, sizeName)
} else {
fieldname := field.Oneof.GoName
if _, ok := oneofs[fieldname]; !ok {
oneofs[fieldname] = struct{}{}
if _, ok := oneofs[fieldname]; ok {
continue
}
oneofs[fieldname] = struct{}{}
if p.IsWellKnownType(message) {
p.P(`switch c := m.`, fieldname, `.(type) {`)
for _, f := range field.Oneof.Fields {
p.P(`case *`, f.GoIdent, `:`)
p.P(`n += (*`, p.WellKnownFieldMap(f), `)(c).`, sizeName, `()`)
}
p.P(`}`)
} else {
//if _, ok := oneofs[fieldname]; !ok {
//oneofs[fieldname] = struct{}{}
p.P(`if vtmsg, ok := m.`, fieldname, `.(interface{ SizeVT() int }); ok {`)
p.P(`n+=vtmsg.`, sizeName, `()`)
p.P(`}`)
Expand Down
52 changes: 46 additions & 6 deletions types/known/structpb/struct_vtproto.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 2c43b2a

Please sign in to comment.