package proto
import (
)
type filePath = string
type fileDescGZIP = []byte
var fileCache sync.Map
func ( filePath, fileDescGZIP) {
, := gzip.NewReader(bytes.NewReader())
if != nil {
panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", ))
}
, := ioutil.ReadAll()
if != nil {
panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", ))
}
protoimpl.DescBuilder{RawDescriptor: }.Build()
fileCache.Store(, )
}
func ( filePath) fileDescGZIP {
if , := fileCache.Load(); {
return .(fileDescGZIP)
}
var []byte
if , := protoregistry.GlobalFiles.FindFileByPath(); != nil {
, _ = Marshal(protodesc.ToFileDescriptorProto())
}
if len() > 0 {
, := fileCache.LoadOrStore(, protoimpl.X.CompressGZIP())
return .(fileDescGZIP)
}
return nil
}
type enumName = string
type enumsByName = map[string]int32
type enumsByNumber = map[int32]string
var enumCache sync.Map
var numFilesCache sync.Map
func ( enumName, enumsByNumber, enumsByName) {
if , := enumCache.Load(); {
panic("proto: duplicate enum registered: " + )
}
enumCache.Store(, )
}
func ( enumName) enumsByName {
if , := enumCache.Load(); {
return .(enumsByName)
}
var protoreflect.FullName
if := strings.LastIndexByte(, '.'); >= 0 {
= protoreflect.FullName([:])
}
, := numFilesCache.Load()
, := .(int)
if protoregistry.GlobalFiles.NumFilesByPackage() == {
return nil
}
= 0
protoregistry.GlobalFiles.RangeFilesByPackage(, func( protoreflect.FileDescriptor) bool {
walkEnums(, func( protoreflect.EnumDescriptor) {
:= protoimpl.X.LegacyEnumName()
if , := enumCache.Load(); ! {
:= make(enumsByName)
:= .Values()
for := .Len() - 1; >= 0; -- {
:= .Get()
[string(.Name())] = int32(.Number())
}
enumCache.LoadOrStore(, )
}
})
++
return true
})
numFilesCache.Store(, )
if , := enumCache.Load(); {
return .(enumsByName)
}
return nil
}
func ( interface {
() protoreflect.EnumDescriptors
() protoreflect.MessageDescriptors
}, func(protoreflect.EnumDescriptor)) {
:= .()
for := .Len() - 1; >= 0; -- {
(.Get())
}
:= .()
for := .Len() - 1; >= 0; -- {
(.Get(), )
}
}
type messageName = string
var messageTypeCache sync.Map
func ( Message, messageName) {
:= protoimpl.X.LegacyMessageTypeOf(, protoreflect.FullName())
if := protoregistry.GlobalTypes.RegisterMessage(); != nil {
panic()
}
messageTypeCache.Store(, reflect.TypeOf())
}
func ( interface{}, messageName) {
:= reflect.TypeOf()
if .Kind() != reflect.Map {
panic(fmt.Sprintf("invalid map kind: %v", ))
}
if , := messageTypeCache.Load(); {
panic(fmt.Errorf("proto: duplicate proto message registered: %s", ))
}
messageTypeCache.Store(, )
}
func ( messageName) reflect.Type {
if , := messageTypeCache.Load(); {
return .(reflect.Type)
}
var reflect.Type
if , := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName()); != nil {
= messageGoType()
}
if == nil {
, := protoregistry.GlobalFiles.FindDescriptorByName(protoreflect.FullName())
if , := .(protoreflect.MessageDescriptor); != nil && .IsMapEntry() {
:= goTypeForField(.Fields().ByNumber(1))
:= goTypeForField(.Fields().ByNumber(2))
= reflect.MapOf(, )
}
}
if != nil {
, := messageTypeCache.LoadOrStore(, )
return .(reflect.Type)
}
return nil
}
func ( protoreflect.FieldDescriptor) reflect.Type {
switch := .Kind(); {
case protoreflect.EnumKind:
if , := protoregistry.GlobalTypes.FindEnumByName(.Enum().FullName()); != nil {
return enumGoType()
}
return reflect.TypeOf(protoreflect.EnumNumber(0))
case protoreflect.MessageKind, protoreflect.GroupKind:
if , := protoregistry.GlobalTypes.FindMessageByName(.Message().FullName()); != nil {
return messageGoType()
}
return reflect.TypeOf((*protoreflect.Message)(nil)).Elem()
default:
return reflect.TypeOf(.Default().Interface())
}
}
func ( protoreflect.EnumType) reflect.Type {
return reflect.TypeOf(.New(0))
}
func ( protoreflect.MessageType) reflect.Type {
return reflect.TypeOf(MessageV1(.Zero().Interface()))
}
func ( Message) messageName {
if == nil {
return ""
}
if , := .(interface{ () messageName }); {
return .()
}
return messageName(protoimpl.X.MessageDescriptorOf().FullName())
}
func ( *ExtensionDesc) {
if := protoregistry.GlobalTypes.RegisterExtension(); != nil {
panic()
}
}
type extensionsByNumber = map[int32]*ExtensionDesc
var extensionCache sync.Map
func ( Message) extensionsByNumber {
:= MessageName()
, := extensionCache.Load()
, := .(extensionsByNumber)
if protoregistry.GlobalTypes.NumExtensionsByMessage(protoreflect.FullName()) == len() {
return
}
= make(extensionsByNumber)
protoregistry.GlobalTypes.RangeExtensionsByMessage(protoreflect.FullName(), func( protoreflect.ExtensionType) bool {
if , := .(*ExtensionDesc); {
[int32(.TypeDescriptor().Number())] =
} else {
}
return true
})
extensionCache.Store(, )
return
}