package impl
import (
)
func ( protoreflect.EnumDescriptor) string {
var string
:= string(.FullName())
if := .ParentFile(); != nil {
= string(.Package())
= strings.TrimPrefix(, +".")
}
if == "" {
return strs.GoCamelCase()
}
return + "." + strs.GoCamelCase()
}
func ( reflect.Value) protoreflect.Enum {
:= legacyLoadEnumType(.Type())
return .New(protoreflect.EnumNumber(.Int()))
}
var legacyEnumTypeCache sync.Map
func ( reflect.Type) protoreflect.EnumType {
if , := legacyEnumTypeCache.Load(); {
return .(protoreflect.EnumType)
}
var protoreflect.EnumType
:= LegacyLoadEnumDesc()
= &legacyEnumType{
desc: ,
goType: ,
}
if , := legacyEnumTypeCache.LoadOrStore(, ); {
return .(protoreflect.EnumType)
}
return
}
type legacyEnumType struct {
desc protoreflect.EnumDescriptor
goType reflect.Type
m sync.Map
}
func ( *legacyEnumType) ( protoreflect.EnumNumber) protoreflect.Enum {
if , := .m.Load(); {
return .(protoreflect.Enum)
}
:= &legacyEnumWrapper{num: , pbTyp: , goTyp: .goType}
.m.Store(, )
return
}
func ( *legacyEnumType) () protoreflect.EnumDescriptor {
return .desc
}
type legacyEnumWrapper struct {
num protoreflect.EnumNumber
pbTyp protoreflect.EnumType
goTyp reflect.Type
}
func ( *legacyEnumWrapper) () protoreflect.EnumDescriptor {
return .pbTyp.Descriptor()
}
func ( *legacyEnumWrapper) () protoreflect.EnumType {
return .pbTyp
}
func ( *legacyEnumWrapper) () protoreflect.EnumNumber {
return .num
}
func ( *legacyEnumWrapper) () protoreflect.Enum {
return
}
func ( *legacyEnumWrapper) () interface{} {
:= reflect.New(.goTyp).Elem()
.SetInt(int64(.num))
return .Interface()
}
var (
_ protoreflect.Enum = (*legacyEnumWrapper)(nil)
_ unwrapper = (*legacyEnumWrapper)(nil)
)
var legacyEnumDescCache sync.Map
func ( reflect.Type) protoreflect.EnumDescriptor {
if , := legacyEnumDescCache.Load(); {
return .(protoreflect.EnumDescriptor)
}
:= reflect.Zero().Interface()
if , := .(protoreflect.Enum); {
panic(fmt.Sprintf("%v already implements proto.Enum", ))
}
, := .(enumV1)
if ! {
return aberrantLoadEnumDesc()
}
, := .EnumDescriptor()
var protoreflect.EnumDescriptor
if len() == 1 {
= legacyLoadFileDesc().Enums().Get([0])
} else {
:= legacyLoadFileDesc().Messages().Get([0])
for , := range [1 : len()-1] {
= .Messages().Get()
}
= .Enums().Get([len()-1])
}
if , := legacyEnumDescCache.LoadOrStore(, ); {
return .(protoreflect.EnumDescriptor)
}
return
}
var aberrantEnumDescCache sync.Map
func ( reflect.Type) protoreflect.EnumDescriptor {
if , := aberrantEnumDescCache.Load(); {
return .(protoreflect.EnumDescriptor)
}
:= &filedesc.Enum{L2: new(filedesc.EnumL2)}
.L0.FullName = AberrantDeriveFullName()
.L0.ParentFile = filedesc.SurrogateProto3
.L2.Values.List = append(.L2.Values.List, filedesc.EnumValue{})
:= &.L2.Values.List[0]
.L0.FullName = .L0.FullName + "_UNKNOWN"
.L0.ParentFile = .L0.ParentFile
.L0.Parent =
if , := aberrantEnumDescCache.LoadOrStore(, ); {
return .(protoreflect.EnumDescriptor)
}
return
}
func ( reflect.Type) protoreflect.FullName {
:= func( rune) rune {
switch {
case == '/':
return '.'
case 'a' <= && <= 'z', 'A' <= && <= 'Z', '0' <= && <= '9':
return
default:
return '_'
}
}
:= strings.Map(, .PkgPath())
:= strings.Map(, .Name())
if == "" {
= fmt.Sprintf("UnknownX%X", reflect.ValueOf().Pointer())
}
:= append(strings.Split(, "."), )
for , := range {
if == "" || ('0' <= [0] && [0] <= '9') {
[] = "x" +
}
}
return protoreflect.FullName(strings.Join(, "."))
}