diff --git a/compile.go b/compile.go index bc9c95f..5dadaab 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 CompileFileRegistry(files, messageName, options...) } // CompileMessageDescriptor compiles a descriptor into a [MessageType], for optimized parsing. @@ -68,6 +56,26 @@ func CompileMessageDescriptor(md protoreflect.MessageDescriptor, options ...Comp return wrapType(ty) } +// 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 + } + 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{}