How to cast descriptorpb.DescriptorProto to protoreflect.MessageDescriptor
Eagleye126 opened this issue · comments
Hey all,
Im trying to create *dynamicpb.Message
the following way:
import (
"github.com/stretchr/testify/assert"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/types/descriptorpb"
"google.golang.org/protobuf/types/dynamicpb"
"testing"
)
func getDescriptorProto(fieldName string) protoreflect.MessageDescriptor {
descProto := descriptorpb.DescriptorProto{
Field: []*descriptorpb.FieldDescriptorProto{
{
Name: proto.String(fieldName),
Type: descriptorpb.FieldDescriptorProto_TYPE_INT32.Enum(),
},
},
}
return descProto.ProtoReflect().Descriptor()
}
func getDynamicMessage(descriptor protoreflect.MessageDescriptor, value int32) *dynamicpb.Message {
dynamicMessage := dynamicpb.NewMessage(descriptor)
dynamicMessage.Set(dynamicMessage.Descriptor().Fields().ByName("id"), protoreflect.ValueOf(value))
return dynamicMessage
}
var (
idDescriptorProto = getDescriptorProto("id")
)
var (
validIdMessage = getDynamicMessage(idDescriptorProto, int32(2))
)
Im getting this panic error:
runtime error: invalid memory address or nil pointer dereference
Seems like it triggers from dynamicMessage.Descriptor().Fields().ByName(...
And thats because descProto.ProtoReflect().Descriptor()
will return the object without the fields I set.
Thank you for helping!
descProto := descriptorpb.DescriptorProto{...}
return descProto.ProtoReflect().Descriptor()
This returns the descriptor of descProto
, not the descriptor in descProto
.
That is, it returns the descriptor for google.protobuf.DescriptorProto
, which does not contain an id
field.
You can use the google.golang.org/protobuf/reflect/protodesc
package to convert a DescriptorProto
to a protoreflect.MessageDescriptor
.
Closing for now. Please reopen the issue if you have further questions.