protogen: Treat bytes field as non-nullable #123
15 changed files with 31 additions and 25 deletions
BIN
acl/grpc/types_frostfs.pb.go
generated
BIN
acl/grpc/types_frostfs.pb.go
generated
Binary file not shown.
BIN
ape/grpc/types_frostfs.pb.go
generated
BIN
ape/grpc/types_frostfs.pb.go
generated
Binary file not shown.
BIN
apemanager/grpc/service_frostfs.pb.go
generated
BIN
apemanager/grpc/service_frostfs.pb.go
generated
Binary file not shown.
BIN
container/grpc/types_frostfs.pb.go
generated
BIN
container/grpc/types_frostfs.pb.go
generated
Binary file not shown.
BIN
netmap/grpc/types_frostfs.pb.go
generated
BIN
netmap/grpc/types_frostfs.pb.go
generated
Binary file not shown.
BIN
object/grpc/service_frostfs.pb.go
generated
BIN
object/grpc/service_frostfs.pb.go
generated
Binary file not shown.
BIN
object/grpc/types_frostfs.pb.go
generated
BIN
object/grpc/types_frostfs.pb.go
generated
Binary file not shown.
BIN
refs/grpc/types_frostfs.pb.go
generated
BIN
refs/grpc/types_frostfs.pb.go
generated
Binary file not shown.
BIN
session/grpc/service_frostfs.pb.go
generated
BIN
session/grpc/service_frostfs.pb.go
generated
Binary file not shown.
BIN
session/grpc/types_frostfs.pb.go
generated
BIN
session/grpc/types_frostfs.pb.go
generated
Binary file not shown.
BIN
status/grpc/types_frostfs.pb.go
generated
BIN
status/grpc/types_frostfs.pb.go
generated
Binary file not shown.
BIN
tombstone/grpc/types_frostfs.pb.go
generated
BIN
tombstone/grpc/types_frostfs.pb.go
generated
Binary file not shown.
|
@ -50,9 +50,6 @@ func TestStableMarshalSingle(t *testing.T) {
|
|||
|
||||
var actualFrostfs generated.Primitives
|
||||
require.NoError(t, actualFrostfs.UnmarshalJSON(r))
|
||||
if len(actualFrostfs.FieldA) == 0 {
|
||||
actualFrostfs.FieldA = nil
|
||||
}
|
||||
require.Equal(t, input, &actualFrostfs)
|
||||
|
||||
primitivesEqual(t, input, &actual)
|
||||
|
@ -110,9 +107,6 @@ func TestStableMarshalSingle(t *testing.T) {
|
|||
|
||||
var actualFrostfs generated.Primitives
|
||||
require.NoError(t, actualFrostfs.UnmarshalJSON(r))
|
||||
if len(actualFrostfs.FieldA) == 0 {
|
||||
actualFrostfs.FieldA = nil
|
||||
}
|
||||
require.Equal(t, tc.input, &actualFrostfs)
|
||||
|
||||
primitivesEqual(t, tc.input, &actual)
|
||||
|
@ -124,9 +118,7 @@ func TestStableMarshalSingle(t *testing.T) {
|
|||
func primitivesEqual(t *testing.T, a *generated.Primitives, b *test.Primitives) {
|
||||
// Compare each field directly, because proto-generated code has private fields.
|
||||
require.Equal(t, len(a.FieldA), len(b.FieldA))
|
||||
if len(a.FieldA) != 0 {
|
||||
require.Equal(t, a.FieldA, b.FieldA)
|
||||
}
|
||||
require.Equal(t, a.FieldA, b.FieldA)
|
||||
require.Equal(t, a.FieldB, b.FieldB)
|
||||
require.Equal(t, a.FieldC, b.FieldC)
|
||||
require.Equal(t, a.FieldD, b.FieldD)
|
||||
|
|
BIN
util/proto/test/custom/test_frostfs.pb.go
generated
BIN
util/proto/test/custom/test_frostfs.pb.go
generated
Binary file not shown.
|
@ -70,6 +70,24 @@ func emitJSONParseInteger(g *protogen.GeneratedFile, ident string, method string
|
|||
g.P(ident, " := ", typ, "(v)")
|
||||
}
|
||||
|
||||
func emitJSONReadEnum(g *protogen.GeneratedFile, name string, enumType string) {
|
||||
g.P(`switch v := in.Interface().(type) {
|
||||
case string:
|
||||
if vv, ok := `+enumType+`_value[v]; ok {
|
||||
`+name+` = `+enumType+`(vv)
|
||||
break
|
||||
}
|
||||
vv, err := `, strconvPackage.Ident("ParseInt"), `(v, 10, 32)
|
||||
if err != nil {
|
||||
in.AddError(err)
|
||||
return
|
||||
}
|
||||
`+name+` = `+enumType+`(vv)
|
||||
case float64:
|
||||
`+name+` = `+enumType+`(v)
|
||||
}`)
|
||||
}
|
||||
|
||||
func emitJSONFieldRead(g *protogen.GeneratedFile, f *protogen.Field, name string) {
|
||||
g.P("{")
|
||||
defer g.P("}")
|
||||
|
@ -94,21 +112,7 @@ func emitJSONFieldRead(g *protogen.GeneratedFile, f *protogen.Field, name string
|
|||
|
||||
enumType := fieldType(g, f).String()
|
||||
g.P("var parsedValue " + enumType)
|
||||
g.P(`switch v := in.Interface().(type) {
|
||||
case string:
|
||||
if vv, ok := `+enumType+`_value[v]; ok {
|
||||
parsedValue = `+enumType+`(vv)
|
||||
break
|
||||
}
|
||||
vv, err := `, strconvPackage.Ident("ParseInt"), `(v, 10, 32)
|
||||
if err != nil {
|
||||
in.AddError(err)
|
||||
return
|
||||
}
|
||||
parsedValue = `+enumType+`(vv)
|
||||
case float64:
|
||||
parsedValue = `+enumType+`(v)
|
||||
}`)
|
||||
emitJSONReadEnum(g, "parsedValue", enumType)
|
||||
template = "%s = parsedValue"
|
||||
case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind:
|
||||
emitJSONParseInteger(g, "pv", "ParseInt", 32, "int32")
|
||||
|
@ -129,7 +133,17 @@ func emitJSONFieldRead(g *protogen.GeneratedFile, f *protogen.Field, name string
|
|||
case protoreflect.StringKind:
|
||||
template = "%s = in.String()"
|
||||
case protoreflect.BytesKind:
|
||||
template = "%s = in.Bytes()"
|
||||
// Since some time ago proto3 support optional keyword, thus the presence is not tracked by default:
|
||||
// https://github.com/protocolbuffers/protobuf-go/blob/fb995f184a1719ec42b247a3771d1036d92adf67/internal/impl/message_reflect_field.go#L327
|
||||
// We do not explicitly support `optional` keyword, protoc will fail on such fileds.
|
||||
// Thus, treat empty string as `[]byte(nil)`.
|
||||
template = `{
|
||||
tmp := in.Bytes()
|
||||
if len(tmp) == 0 {
|
||||
tmp = nil
|
||||
}
|
||||
%s = tmp
|
||||
}`
|
||||
case protoreflect.MessageKind:
|
||||
if f.Desc.IsList() {
|
||||
g.P("f = ", fieldType(g, f)[2:], "{}")
|
||||
|
|
Loading…
Reference in a new issue