package order
import (
)
type FieldOrder func(x, y protoreflect.FieldDescriptor) bool
var (
AnyFieldOrder FieldOrder = nil
LegacyFieldOrder FieldOrder = func(, protoreflect.FieldDescriptor) bool {
, := .ContainingOneof(), .ContainingOneof()
:= func( protoreflect.OneofDescriptor) bool {
return != nil && !.IsSynthetic()
}
if .IsExtension() != .IsExtension() {
return .IsExtension() && !.IsExtension()
}
if () != () {
return !() && ()
}
if () && () && != {
return .Index() < .Index()
}
return .Number() < .Number()
}
NumberFieldOrder FieldOrder = func(, protoreflect.FieldDescriptor) bool {
return .Number() < .Number()
}
IndexNameFieldOrder FieldOrder = func(, protoreflect.FieldDescriptor) bool {
if .IsExtension() != .IsExtension() {
return !.IsExtension() && .IsExtension()
}
if .IsExtension() && .IsExtension() {
return .FullName() < .FullName()
}
return .Index() < .Index()
}
)
type KeyOrder func(x, y protoreflect.MapKey) bool
var (
AnyKeyOrder KeyOrder = nil
GenericKeyOrder KeyOrder = func(, protoreflect.MapKey) bool {
switch .Interface().(type) {
case bool:
return !.Bool() && .Bool()
case int32, int64:
return .Int() < .Int()
case uint32, uint64:
return .Uint() < .Uint()
case string:
return .String() < .String()
default:
panic("invalid map key type")
}
}
)