From 07c233ba95ad9ee43d051fa946004ac2cd28d067 Mon Sep 17 00:00:00 2001 From: "marco.ferrer" Date: Fri, 8 Aug 2025 17:33:37 -0400 Subject: [PATCH 1/2] add support for compiling from a file registry --- compile.go | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/compile.go b/compile.go index bc9c95f..ce13d9e 100644 --- a/compile.go +++ b/compile.go @@ -33,19 +33,7 @@ func CompileFileDescriptorSet(fds *descriptorpb.FileDescriptorSet, messageName p if err != nil { return nil, err } - desc, err := files.FindDescriptorByName(messageName) - if err != nil { - return nil, err - } - msgDesc, ok := desc.(protoreflect.MessageDescriptor) - if !ok { - return nil, protoregistry.NotFound - } - - // Allow the caller to override the extension registry by placing our - // default registry first. - options = append([]CompileOption{WithExtensionsFromFiles(files)}, options...) - return CompileMessageDescriptor(msgDesc, options...), nil + return CompileProtoRegistryFiles(files, messageName, options...) } // CompileMessageDescriptor compiles a descriptor into a [MessageType], for optimized parsing. @@ -68,6 +56,23 @@ func CompileMessageDescriptor(md protoreflect.MessageDescriptor, options ...Comp return wrapType(ty) } +// CompileProtoRegistryFiles look's up a message with the given name using the supplied protobuf file registry, and compiles a type for it. +func CompileProtoRegistryFiles(files *protoregistry.Files, messageName protoreflect.FullName, options ...CompileOption) (*MessageType, error) { + desc, err := files.FindDescriptorByName(messageName) + if err != nil { + return nil, err + } + msgDesc, ok := desc.(protoreflect.MessageDescriptor) + if !ok { + return nil, protoregistry.NotFound + } + + // Allow the caller to override the extension registry by placing our + // default registry first. + options = append([]CompileOption{WithExtensionsFromFiles(files)}, options...) + return CompileMessageDescriptor(msgDesc, options...), nil +} + // backend implements the compiler backend interface. type backend struct{} From c7ce1984216c03b00e19519ec5fcccc682540151 Mon Sep 17 00:00:00 2001 From: "marco.ferrer" Date: Fri, 10 Oct 2025 11:30:50 -0400 Subject: [PATCH 2/2] address PR feedback --- compile.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/compile.go b/compile.go index ce13d9e..5dadaab 100644 --- a/compile.go +++ b/compile.go @@ -33,7 +33,7 @@ func CompileFileDescriptorSet(fds *descriptorpb.FileDescriptorSet, messageName p if err != nil { return nil, err } - return CompileProtoRegistryFiles(files, messageName, options...) + return CompileFileRegistry(files, messageName, options...) } // CompileMessageDescriptor compiles a descriptor into a [MessageType], for optimized parsing. @@ -56,8 +56,11 @@ func CompileMessageDescriptor(md protoreflect.MessageDescriptor, options ...Comp return wrapType(ty) } -// CompileProtoRegistryFiles look's up a message with the given name using the supplied protobuf file registry, and compiles a type for it. -func CompileProtoRegistryFiles(files *protoregistry.Files, messageName protoreflect.FullName, options ...CompileOption) (*MessageType, error) { +// CompileFileRegistry looks up a [protoreflect.MessageDescriptor] from a [protoregistry.Files] and +// compiles a [MessageType] for it. +// +// Returns an error if no message type exists in the registry with that name. +func CompileFileRegistry(files *protoregistry.Files, messageName protoreflect.FullName, options ...CompileOption) (*MessageType, error) { desc, err := files.FindDescriptorByName(messageName) if err != nil { return nil, err