package impl
import (
)
type errInvalidUTF8 struct{}
func (errInvalidUTF8) () string { return "string field contains invalid UTF-8" }
func (errInvalidUTF8) () bool { return true }
func (errInvalidUTF8) () error { return errors.Error }
func ( *MessageInfo) ( protoreflect.OneofDescriptor, structInfo) {
:= .oneofsByName[.Name()]
:= .Type
:= make(map[reflect.Type]*coderFieldInfo)
:= false
:= .Fields()
for , := 0, .Len(); < ; ++ {
:= .Fields().Get()
:= .Number()
:= *.coderFields[]
:= .oneofWrappersByNumber[]
.ft = .Field(0).Type
.mi, .funcs = fieldCoder(, .ft)
[] = &
if .funcs.isInit != nil {
= true
}
.coderFields[].funcs.unmarshal = func( []byte, pointer, protowire.Type, *coderFieldInfo, unmarshalOptions) (unmarshalOutput, error) {
var reflect.Value
:= .AsValueOf().Elem()
if !.IsNil() && !.Elem().IsNil() && .Elem().Elem().Type() == {
= .Elem()
} else {
= reflect.New()
}
, := .funcs.unmarshal(, pointerOfValue().Apply(zeroOffset), , &, )
if != nil {
return ,
}
.Set()
return , nil
}
}
:= func( pointer) (pointer, *coderFieldInfo) {
:= .AsValueOf().Elem()
if .IsNil() {
return pointer{}, nil
}
= .Elem()
if .IsNil() {
return pointer{}, nil
}
return pointerOfValue().Apply(zeroOffset), [.Elem().Type()]
}
:= .coderFields[.Fields().Get(0).Number()]
.funcs.size = func( pointer, *coderFieldInfo, marshalOptions) int {
, := ()
if == nil || .funcs.size == nil {
return 0
}
return .funcs.size(, , )
}
.funcs.marshal = func( []byte, pointer, *coderFieldInfo, marshalOptions) ([]byte, error) {
, := ()
if == nil || .funcs.marshal == nil {
return , nil
}
return .funcs.marshal(, , , )
}
.funcs.merge = func(, pointer, *coderFieldInfo, mergeOptions) {
, := ()
if == nil || .funcs.merge == nil {
return
}
, := ()
if != {
.AsValueOf().Elem().Set(reflect.New(.AsValueOf().Elem().Elem().Elem().Type()))
= pointerOfValue(.AsValueOf().Elem().Elem()).Apply(zeroOffset)
}
.funcs.merge(, , , )
}
if {
.funcs.isInit = func( pointer, *coderFieldInfo) error {
, := ()
if == nil || .funcs.isInit == nil {
return nil
}
return .funcs.isInit(, )
}
}
}
func ( protoreflect.FieldDescriptor) pointerCoderFuncs {
var sync.Once
var protoreflect.MessageType
:= func() {
.Do(func() {
:= .Message().FullName()
, _ = protoregistry.GlobalTypes.FindMessageByName()
})
}
return pointerCoderFuncs{
size: func( pointer, *coderFieldInfo, marshalOptions) int {
, := .WeakFields().get(.num)
if ! {
return 0
}
()
if == nil {
panic(fmt.Sprintf("weak message %v is not linked in", .Message().FullName()))
}
return sizeMessage(, .tagsize, )
},
marshal: func( []byte, pointer, *coderFieldInfo, marshalOptions) ([]byte, error) {
, := .WeakFields().get(.num)
if ! {
return , nil
}
()
if == nil {
panic(fmt.Sprintf("weak message %v is not linked in", .Message().FullName()))
}
return appendMessage(, , .wiretag, )
},
unmarshal: func( []byte, pointer, protowire.Type, *coderFieldInfo, unmarshalOptions) (unmarshalOutput, error) {
:= .WeakFields()
, := .get(.num)
if ! {
()
if == nil {
return unmarshalOutput{}, errUnknown
}
= .New().Interface()
.set(.num, )
}
return consumeMessage(, , , )
},
isInit: func( pointer, *coderFieldInfo) error {
, := .WeakFields().get(.num)
if ! {
return nil
}
return proto.CheckInitialized()
},
merge: func(, pointer, *coderFieldInfo, mergeOptions) {
, := .WeakFields().get(.num)
if ! {
return
}
, := .WeakFields().get(.num)
if ! {
()
if == nil {
panic(fmt.Sprintf("weak message %v is not linked in", .Message().FullName()))
}
= .New().Interface()
.WeakFields().set(.num, )
}
.Merge(, )
},
}
}
func ( protoreflect.FieldDescriptor, reflect.Type) pointerCoderFuncs {
if := getMessageInfo(); != nil {
:= pointerCoderFuncs{
size: sizeMessageInfo,
marshal: appendMessageInfo,
unmarshal: consumeMessageInfo,
merge: mergeMessage,
}
if needsInitCheck(.Desc) {
.isInit = isInitMessageInfo
}
return
} else {
return pointerCoderFuncs{
size: func( pointer, *coderFieldInfo, marshalOptions) int {
:= asMessage(.AsValueOf().Elem())
return sizeMessage(, .tagsize, )
},
marshal: func( []byte, pointer, *coderFieldInfo, marshalOptions) ([]byte, error) {
:= asMessage(.AsValueOf().Elem())
return appendMessage(, , .wiretag, )
},
unmarshal: func( []byte, pointer, protowire.Type, *coderFieldInfo, unmarshalOptions) (unmarshalOutput, error) {
:= .AsValueOf().Elem()
if .IsNil() {
.Set(reflect.New(.Elem()))
}
return consumeMessage(, asMessage(), , )
},
isInit: func( pointer, *coderFieldInfo) error {
:= asMessage(.AsValueOf().Elem())
return proto.CheckInitialized()
},
merge: mergeMessage,
}
}
}
func ( pointer, *coderFieldInfo, marshalOptions) int {
return protowire.SizeBytes(.mi.sizePointer(.Elem(), )) + .tagsize
}
func ( []byte, pointer, *coderFieldInfo, marshalOptions) ([]byte, error) {
= protowire.AppendVarint(, .wiretag)
= protowire.AppendVarint(, uint64(.mi.sizePointer(.Elem(), )))
return .mi.marshalAppendPointer(, .Elem(), )
}
func ( []byte, pointer, protowire.Type, *coderFieldInfo, unmarshalOptions) ( unmarshalOutput, error) {
if != protowire.BytesType {
return , errUnknown
}
, := protowire.ConsumeBytes()
if < 0 {
return , errDecode
}
if .Elem().IsNil() {
.SetPointer(pointerOfValue(reflect.New(.mi.GoReflectType.Elem())))
}
, := .mi.unmarshalPointer(, .Elem(), 0, )
if != nil {
return ,
}
.n =
.initialized = .initialized
return , nil
}
func ( pointer, *coderFieldInfo) error {
return .mi.checkInitializedPointer(.Elem())
}
func ( proto.Message, int, marshalOptions) int {
return protowire.SizeBytes(proto.Size()) +
}
func ( []byte, proto.Message, uint64, marshalOptions) ([]byte, error) {
= protowire.AppendVarint(, )
= protowire.AppendVarint(, uint64(proto.Size()))
return .Options().MarshalAppend(, )
}
func ( []byte, proto.Message, protowire.Type, unmarshalOptions) ( unmarshalOutput, error) {
if != protowire.BytesType {
return , errUnknown
}
, := protowire.ConsumeBytes()
if < 0 {
return , errDecode
}
, := .Options().UnmarshalState(protoiface.UnmarshalInput{
Buf: ,
Message: .ProtoReflect(),
})
if != nil {
return ,
}
.n =
.initialized = .Flags&protoiface.UnmarshalInitialized != 0
return , nil
}
func ( protoreflect.Value, int, marshalOptions) int {
:= .Message().Interface()
return sizeMessage(, , )
}
func ( []byte, protoreflect.Value, uint64, marshalOptions) ([]byte, error) {
:= .Message().Interface()
return appendMessage(, , , )
}
func ( []byte, protoreflect.Value, protowire.Number, protowire.Type, unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) {
:= .Message().Interface()
, := consumeMessage(, , , )
return , ,
}
func ( protoreflect.Value) error {
:= .Message().Interface()
return proto.CheckInitialized()
}
var coderMessageValue = valueCoderFuncs{
size: sizeMessageValue,
marshal: appendMessageValue,
unmarshal: consumeMessageValue,
isInit: isInitMessageValue,
merge: mergeMessageValue,
}
func ( protoreflect.Value, int, marshalOptions) int {
:= .Message().Interface()
return sizeGroup(, , )
}
func ( []byte, protoreflect.Value, uint64, marshalOptions) ([]byte, error) {
:= .Message().Interface()
return appendGroup(, , , )
}
func ( []byte, protoreflect.Value, protowire.Number, protowire.Type, unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) {
:= .Message().Interface()
, := consumeGroup(, , , , )
return , ,
}
var coderGroupValue = valueCoderFuncs{
size: sizeGroupValue,
marshal: appendGroupValue,
unmarshal: consumeGroupValue,
isInit: isInitMessageValue,
merge: mergeMessageValue,
}
func ( protoreflect.FieldDescriptor, reflect.Type) pointerCoderFuncs {
:= .Number()
if := getMessageInfo(); != nil {
:= pointerCoderFuncs{
size: sizeGroupType,
marshal: appendGroupType,
unmarshal: consumeGroupType,
merge: mergeMessage,
}
if needsInitCheck(.Desc) {
.isInit = isInitMessageInfo
}
return
} else {
return pointerCoderFuncs{
size: func( pointer, *coderFieldInfo, marshalOptions) int {
:= asMessage(.AsValueOf().Elem())
return sizeGroup(, .tagsize, )
},
marshal: func( []byte, pointer, *coderFieldInfo, marshalOptions) ([]byte, error) {
:= asMessage(.AsValueOf().Elem())
return appendGroup(, , .wiretag, )
},
unmarshal: func( []byte, pointer, protowire.Type, *coderFieldInfo, unmarshalOptions) (unmarshalOutput, error) {
:= .AsValueOf().Elem()
if .IsNil() {
.Set(reflect.New(.Elem()))
}
return consumeGroup(, asMessage(), , , )
},
isInit: func( pointer, *coderFieldInfo) error {
:= asMessage(.AsValueOf().Elem())
return proto.CheckInitialized()
},
merge: mergeMessage,
}
}
}
func ( pointer, *coderFieldInfo, marshalOptions) int {
return 2*.tagsize + .mi.sizePointer(.Elem(), )
}
func ( []byte, pointer, *coderFieldInfo, marshalOptions) ([]byte, error) {
= protowire.AppendVarint(, .wiretag)
, := .mi.marshalAppendPointer(, .Elem(), )
= protowire.AppendVarint(, .wiretag+1)
return ,
}
func ( []byte, pointer, protowire.Type, *coderFieldInfo, unmarshalOptions) ( unmarshalOutput, error) {
if != protowire.StartGroupType {
return , errUnknown
}
if .Elem().IsNil() {
.SetPointer(pointerOfValue(reflect.New(.mi.GoReflectType.Elem())))
}
return .mi.unmarshalPointer(, .Elem(), .num, )
}
func ( proto.Message, int, marshalOptions) int {
return 2* + proto.Size()
}
func ( []byte, proto.Message, uint64, marshalOptions) ([]byte, error) {
= protowire.AppendVarint(, )
, := .Options().MarshalAppend(, )
= protowire.AppendVarint(, +1)
return ,
}
func ( []byte, proto.Message, protowire.Number, protowire.Type, unmarshalOptions) ( unmarshalOutput, error) {
if != protowire.StartGroupType {
return , errUnknown
}
, := protowire.ConsumeGroup(, )
if < 0 {
return , errDecode
}
, := .Options().UnmarshalState(protoiface.UnmarshalInput{
Buf: ,
Message: .ProtoReflect(),
})
if != nil {
return ,
}
.n =
.initialized = .Flags&protoiface.UnmarshalInitialized != 0
return , nil
}
func ( protoreflect.FieldDescriptor, reflect.Type) pointerCoderFuncs {
if := getMessageInfo(); != nil {
:= pointerCoderFuncs{
size: sizeMessageSliceInfo,
marshal: appendMessageSliceInfo,
unmarshal: consumeMessageSliceInfo,
merge: mergeMessageSlice,
}
if needsInitCheck(.Desc) {
.isInit = isInitMessageSliceInfo
}
return
}
return pointerCoderFuncs{
size: func( pointer, *coderFieldInfo, marshalOptions) int {
return sizeMessageSlice(, , .tagsize, )
},
marshal: func( []byte, pointer, *coderFieldInfo, marshalOptions) ([]byte, error) {
return appendMessageSlice(, , .wiretag, , )
},
unmarshal: func( []byte, pointer, protowire.Type, *coderFieldInfo, unmarshalOptions) (unmarshalOutput, error) {
return consumeMessageSlice(, , , , )
},
isInit: func( pointer, *coderFieldInfo) error {
return isInitMessageSlice(, )
},
merge: mergeMessageSlice,
}
}
func ( pointer, *coderFieldInfo, marshalOptions) int {
:= .PointerSlice()
:= 0
for , := range {
+= protowire.SizeBytes(.mi.sizePointer(, )) + .tagsize
}
return
}
func ( []byte, pointer, *coderFieldInfo, marshalOptions) ([]byte, error) {
:= .PointerSlice()
var error
for , := range {
= protowire.AppendVarint(, .wiretag)
:= .mi.sizePointer(, )
= protowire.AppendVarint(, uint64())
, = .mi.marshalAppendPointer(, , )
if != nil {
return ,
}
}
return , nil
}
func ( []byte, pointer, protowire.Type, *coderFieldInfo, unmarshalOptions) ( unmarshalOutput, error) {
if != protowire.BytesType {
return , errUnknown
}
, := protowire.ConsumeBytes()
if < 0 {
return , errDecode
}
:= reflect.New(.mi.GoReflectType.Elem()).Interface()
:= pointerOfIface()
, := .mi.unmarshalPointer(, , 0, )
if != nil {
return ,
}
.AppendPointerSlice()
.n =
.initialized = .initialized
return , nil
}
func ( pointer, *coderFieldInfo) error {
:= .PointerSlice()
for , := range {
if := .mi.checkInitializedPointer(); != nil {
return
}
}
return nil
}
func ( pointer, reflect.Type, int, marshalOptions) int {
:= .PointerSlice()
:= 0
for , := range {
:= asMessage(.AsValueOf(.Elem()))
+= protowire.SizeBytes(proto.Size()) +
}
return
}
func ( []byte, pointer, uint64, reflect.Type, marshalOptions) ([]byte, error) {
:= .PointerSlice()
var error
for , := range {
:= asMessage(.AsValueOf(.Elem()))
= protowire.AppendVarint(, )
:= proto.Size()
= protowire.AppendVarint(, uint64())
, = .Options().MarshalAppend(, )
if != nil {
return ,
}
}
return , nil
}
func ( []byte, pointer, reflect.Type, protowire.Type, unmarshalOptions) ( unmarshalOutput, error) {
if != protowire.BytesType {
return , errUnknown
}
, := protowire.ConsumeBytes()
if < 0 {
return , errDecode
}
:= reflect.New(.Elem())
, := .Options().UnmarshalState(protoiface.UnmarshalInput{
Buf: ,
Message: asMessage().ProtoReflect(),
})
if != nil {
return ,
}
.AppendPointerSlice(pointerOfValue())
.n =
.initialized = .Flags&protoiface.UnmarshalInitialized != 0
return , nil
}
func ( pointer, reflect.Type) error {
:= .PointerSlice()
for , := range {
:= asMessage(.AsValueOf(.Elem()))
if := proto.CheckInitialized(); != nil {
return
}
}
return nil
}
func ( protoreflect.Value, int, marshalOptions) int {
:= .List()
:= 0
for , := 0, .Len(); < ; ++ {
:= .Get().Message().Interface()
+= protowire.SizeBytes(proto.Size()) +
}
return
}
func ( []byte, protoreflect.Value, uint64, marshalOptions) ([]byte, error) {
:= .List()
:= .Options()
for , := 0, .Len(); < ; ++ {
:= .Get().Message().Interface()
= protowire.AppendVarint(, )
:= proto.Size()
= protowire.AppendVarint(, uint64())
var error
, = .MarshalAppend(, )
if != nil {
return ,
}
}
return , nil
}
func ( []byte, protoreflect.Value, protowire.Number, protowire.Type, unmarshalOptions) ( protoreflect.Value, unmarshalOutput, error) {
:= .List()
if != protowire.BytesType {
return protoreflect.Value{}, , errUnknown
}
, := protowire.ConsumeBytes()
if < 0 {
return protoreflect.Value{}, , errDecode
}
:= .NewElement()
, := .Options().UnmarshalState(protoiface.UnmarshalInput{
Buf: ,
Message: .Message(),
})
if != nil {
return protoreflect.Value{}, ,
}
.Append()
.n =
.initialized = .Flags&protoiface.UnmarshalInitialized != 0
return , , nil
}
func ( protoreflect.Value) error {
:= .List()
for , := 0, .Len(); < ; ++ {
:= .Get().Message().Interface()
if := proto.CheckInitialized(); != nil {
return
}
}
return nil
}
var coderMessageSliceValue = valueCoderFuncs{
size: sizeMessageSliceValue,
marshal: appendMessageSliceValue,
unmarshal: consumeMessageSliceValue,
isInit: isInitMessageSliceValue,
merge: mergeMessageListValue,
}
func ( protoreflect.Value, int, marshalOptions) int {
:= .List()
:= 0
for , := 0, .Len(); < ; ++ {
:= .Get().Message().Interface()
+= 2* + proto.Size()
}
return
}
func ( []byte, protoreflect.Value, uint64, marshalOptions) ([]byte, error) {
:= .List()
:= .Options()
for , := 0, .Len(); < ; ++ {
:= .Get().Message().Interface()
= protowire.AppendVarint(, )
var error
, = .MarshalAppend(, )
if != nil {
return ,
}
= protowire.AppendVarint(, +1)
}
return , nil
}
func ( []byte, protoreflect.Value, protowire.Number, protowire.Type, unmarshalOptions) ( protoreflect.Value, unmarshalOutput, error) {
:= .List()
if != protowire.StartGroupType {
return protoreflect.Value{}, , errUnknown
}
, := protowire.ConsumeGroup(, )
if < 0 {
return protoreflect.Value{}, , errDecode
}
:= .NewElement()
, := .Options().UnmarshalState(protoiface.UnmarshalInput{
Buf: ,
Message: .Message(),
})
if != nil {
return protoreflect.Value{}, ,
}
.Append()
.n =
.initialized = .Flags&protoiface.UnmarshalInitialized != 0
return , , nil
}
var coderGroupSliceValue = valueCoderFuncs{
size: sizeGroupSliceValue,
marshal: appendGroupSliceValue,
unmarshal: consumeGroupSliceValue,
isInit: isInitMessageSliceValue,
merge: mergeMessageListValue,
}
func ( protoreflect.FieldDescriptor, reflect.Type) pointerCoderFuncs {
:= .Number()
if := getMessageInfo(); != nil {
:= pointerCoderFuncs{
size: sizeGroupSliceInfo,
marshal: appendGroupSliceInfo,
unmarshal: consumeGroupSliceInfo,
merge: mergeMessageSlice,
}
if needsInitCheck(.Desc) {
.isInit = isInitMessageSliceInfo
}
return
}
return pointerCoderFuncs{
size: func( pointer, *coderFieldInfo, marshalOptions) int {
return sizeGroupSlice(, , .tagsize, )
},
marshal: func( []byte, pointer, *coderFieldInfo, marshalOptions) ([]byte, error) {
return appendGroupSlice(, , .wiretag, , )
},
unmarshal: func( []byte, pointer, protowire.Type, *coderFieldInfo, unmarshalOptions) (unmarshalOutput, error) {
return consumeGroupSlice(, , , , , )
},
isInit: func( pointer, *coderFieldInfo) error {
return isInitMessageSlice(, )
},
merge: mergeMessageSlice,
}
}
func ( pointer, reflect.Type, int, marshalOptions) int {
:= .PointerSlice()
:= 0
for , := range {
:= asMessage(.AsValueOf(.Elem()))
+= 2* + proto.Size()
}
return
}
func ( []byte, pointer, uint64, reflect.Type, marshalOptions) ([]byte, error) {
:= .PointerSlice()
var error
for , := range {
:= asMessage(.AsValueOf(.Elem()))
= protowire.AppendVarint(, )
, = .Options().MarshalAppend(, )
if != nil {
return ,
}
= protowire.AppendVarint(, +1)
}
return , nil
}
func ( []byte, pointer, protowire.Number, protowire.Type, reflect.Type, unmarshalOptions) ( unmarshalOutput, error) {
if != protowire.StartGroupType {
return , errUnknown
}
, := protowire.ConsumeGroup(, )
if < 0 {
return , errDecode
}
:= reflect.New(.Elem())
, := .Options().UnmarshalState(protoiface.UnmarshalInput{
Buf: ,
Message: asMessage().ProtoReflect(),
})
if != nil {
return ,
}
.AppendPointerSlice(pointerOfValue())
.n =
.initialized = .Flags&protoiface.UnmarshalInitialized != 0
return , nil
}
func ( pointer, *coderFieldInfo, marshalOptions) int {
:= .PointerSlice()
:= 0
for , := range {
+= 2*.tagsize + .mi.sizePointer(, )
}
return
}
func ( []byte, pointer, *coderFieldInfo, marshalOptions) ([]byte, error) {
:= .PointerSlice()
var error
for , := range {
= protowire.AppendVarint(, .wiretag)
, = .mi.marshalAppendPointer(, , )
if != nil {
return ,
}
= protowire.AppendVarint(, .wiretag+1)
}
return , nil
}
func ( []byte, pointer, protowire.Type, *coderFieldInfo, unmarshalOptions) (unmarshalOutput, error) {
if != protowire.StartGroupType {
return unmarshalOutput{}, errUnknown
}
:= reflect.New(.mi.GoReflectType.Elem()).Interface()
:= pointerOfIface()
, := .mi.unmarshalPointer(, , .num, )
if != nil {
return ,
}
.AppendPointerSlice()
return , nil
}
func ( reflect.Value) protoreflect.ProtoMessage {
if , := .Interface().(protoreflect.ProtoMessage); {
return
}
return legacyWrapMessage().Interface()
}