package proto
import (
)
type (
ExtensionDesc = protoimpl.ExtensionInfo
ExtensionRange = protoiface.ExtensionRangeV1
Extension = protoimpl.ExtensionFieldV1
XXX_InternalExtensions = protoimpl.ExtensionFields
)
var ErrMissingExtension = errors.New("proto: missing extension")
var errNotExtendable = errors.New("proto: not an extendable proto.Message")
func ( Message, *ExtensionDesc) ( bool) {
:= MessageReflect()
if == nil || !.IsValid() {
return false
}
:= .TypeDescriptor()
if isValidExtension(.Descriptor(), ) {
= .Has()
} else {
.Range(func( protoreflect.FieldDescriptor, protoreflect.Value) bool {
= int32(.Number()) == .Field
return !
})
}
for := .GetUnknown(); ! && len() > 0; {
, , := protowire.ConsumeField()
= int32() == .Field
= [:]
}
return
}
func ( Message, *ExtensionDesc) {
:= MessageReflect()
if == nil || !.IsValid() {
return
}
:= .TypeDescriptor()
if isValidExtension(.Descriptor(), ) {
.Clear()
} else {
.Range(func( protoreflect.FieldDescriptor, protoreflect.Value) bool {
if int32(.Number()) == .Field {
.Clear()
return false
}
return true
})
}
clearUnknown(, fieldNum(.Field))
}
func ( Message) {
:= MessageReflect()
if == nil || !.IsValid() {
return
}
.Range(func( protoreflect.FieldDescriptor, protoreflect.Value) bool {
if .IsExtension() {
.Clear()
}
return true
})
clearUnknown(, .Descriptor().ExtensionRanges())
}
func ( Message, *ExtensionDesc) (interface{}, error) {
:= MessageReflect()
if == nil || !.IsValid() || .Descriptor().ExtensionRanges().Len() == 0 {
return nil, errNotExtendable
}
var protoreflect.RawFields
for := .GetUnknown(); len() > 0; {
, , := protowire.ConsumeField()
if int32() == .Field {
= append(, [:]...)
}
= [:]
}
if .ExtensionType == nil {
return []byte(), nil
}
:= .TypeDescriptor()
if !isValidExtension(.Descriptor(), ) {
return nil, fmt.Errorf("proto: bad extended type; %T does not extend %T", .ExtendedType, )
}
if !.Has() && len() > 0 {
:= .New()
if := (proto.UnmarshalOptions{
Resolver: extensionResolver{},
}.Unmarshal(, .Interface())); != nil {
return nil,
}
if .Has() {
.Set(, .Get())
clearUnknown(, fieldNum(.Field))
}
}
var protoreflect.Value
switch {
case .Has():
= .Get()
case .HasDefault():
= .Default()
default:
return nil, ErrMissingExtension
}
:= .InterfaceOf()
:= reflect.ValueOf()
if isScalarKind(.Kind()) {
:= reflect.New(.Type())
.Elem().Set()
= .Interface()
}
return , nil
}
type extensionResolver struct{ xt protoreflect.ExtensionType }
func ( extensionResolver) ( protoreflect.FullName) (protoreflect.ExtensionType, error) {
if := .xt.TypeDescriptor(); .FullName() == {
return .xt, nil
}
return protoregistry.GlobalTypes.FindExtensionByName()
}
func ( extensionResolver) ( protoreflect.FullName, protoreflect.FieldNumber) (protoreflect.ExtensionType, error) {
if := .xt.TypeDescriptor(); .ContainingMessage().FullName() == && .Number() == {
return .xt, nil
}
return protoregistry.GlobalTypes.FindExtensionByNumber(, )
}
func ( Message, []*ExtensionDesc) ([]interface{}, error) {
:= MessageReflect()
if == nil || !.IsValid() {
return nil, errNotExtendable
}
:= make([]interface{}, len())
for , := range {
, := GetExtension(, )
if != nil {
if == ErrMissingExtension {
continue
}
return ,
}
[] =
}
return , nil
}
func ( Message, *ExtensionDesc, interface{}) error {
:= MessageReflect()
if == nil || !.IsValid() || .Descriptor().ExtensionRanges().Len() == 0 {
return errNotExtendable
}
:= reflect.ValueOf()
if reflect.TypeOf() != reflect.TypeOf(.ExtensionType) {
return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", , .ExtensionType)
}
if .Kind() == reflect.Ptr {
if .IsNil() {
return fmt.Errorf("proto: SetExtension called with nil value of type %T", )
}
if isScalarKind(.Elem().Kind()) {
= .Elem().Interface()
}
}
:= .TypeDescriptor()
if !isValidExtension(.Descriptor(), ) {
return fmt.Errorf("proto: bad extended type; %T does not extend %T", .ExtendedType, )
}
.Set(, .ValueOf())
clearUnknown(, fieldNum(.Field))
return nil
}
func ( Message, int32, []byte) {
:= MessageReflect()
if == nil || !.IsValid() {
return
}
for := ; len() > 0; {
, , := protowire.ConsumeField()
if int32() != {
panic(fmt.Sprintf("mismatching field number: got %d, want %d", , ))
}
= [:]
}
ClearExtension(, &ExtensionDesc{Field: })
.SetUnknown(append(.GetUnknown(), ...))
}
func ( Message) ([]*ExtensionDesc, error) {
:= MessageReflect()
if == nil || !.IsValid() || .Descriptor().ExtensionRanges().Len() == 0 {
return nil, errNotExtendable
}
:= make(map[protoreflect.FieldNumber]*ExtensionDesc)
.Range(func( protoreflect.FieldDescriptor, protoreflect.Value) bool {
if .IsExtension() {
:= .(protoreflect.ExtensionTypeDescriptor)
if , := .Type().(*ExtensionDesc); {
[.Number()] =
}
}
return true
})
:= .Descriptor().ExtensionRanges()
for := .GetUnknown(); len() > 0; {
, , := protowire.ConsumeField()
if .Has() && [] == nil {
[] = nil
}
= [:]
}
var []*ExtensionDesc
for , := range {
if == nil {
= &ExtensionDesc{Field: int32()}
}
= append(, )
}
return , nil
}
func ( protoreflect.MessageDescriptor, protoreflect.ExtensionTypeDescriptor) bool {
return .ContainingMessage() == && .ExtensionRanges().Has(.Number())
}
func ( reflect.Kind) bool {
switch {
case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
return true
default:
return false
}
}
func ( protoreflect.Message, interface {
(protoreflect.FieldNumber) bool
}) {
var protoreflect.RawFields
for := .GetUnknown(); len() > 0; {
, , := protowire.ConsumeField()
if !.() {
= append(, [:]...)
}
= [:]
}
if := .GetUnknown(); len() != len() {
.SetUnknown()
}
}
type fieldNum protoreflect.FieldNumber
func ( fieldNum) ( protoreflect.FieldNumber) bool {
return protoreflect.FieldNumber() ==
}