How to convert descriptorpb.DescriptorProto to protoreflect.MessageDescriptor

61 views Asked by At

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 invalid memory address or nil pointer dereference most likely because descProto.ProtoReflect().Descriptor() is not working properly.

Does anyone see what Im missing out?

I tried debugging the function and saw that from some reason my message info is nil.

0

There are 0 answers