cf := *mi .coderFields [num ]
ot := si .oneofWrappersByNumber [num ]
cf .ft = ot .Field (0 ).Type
cf .mi , cf .funcs = fieldCoder (fd , cf .ft )
oneofFields [ot ] = &cf
if cf .funcs .isInit != nil {
needIsInit = true
}
mi .coderFields [num ].funcs .unmarshal = func (b []byte , p pointer , wtyp protowire .Type , f *coderFieldInfo , opts unmarshalOptions ) (unmarshalOutput , error ) {
var vw reflect .Value
vi := p .AsValueOf (ft ).Elem ()
if !vi .IsNil () && !vi .Elem ().IsNil () && vi .Elem ().Elem ().Type () == ot {
vw = vi .Elem ()
} else {
vw = reflect .New (ot )
}
out , err := cf .funcs .unmarshal (b , pointerOfValue (vw ).Apply (zeroOffset ), wtyp , &cf , opts )
if err != nil {
return out , err
}
vi .Set (vw )
return out , nil
}
}
getInfo := func (p pointer ) (pointer , *coderFieldInfo ) {
v := p .AsValueOf (ft ).Elem ()
if v .IsNil () {
return pointer {}, nil
}
v = v .Elem ()
if v .IsNil () {
return pointer {}, nil
}
return pointerOfValue (v ).Apply (zeroOffset ), oneofFields [v .Elem ().Type ()]
}
first := mi .coderFields [od .Fields ().Get (0 ).Number ()]
first .funcs .size = func (p pointer , _ *coderFieldInfo , opts marshalOptions ) int {
p , info := getInfo (p )
if info == nil || info .funcs .size == nil {
return 0
}
return info .funcs .size (p , info , opts )
}
first .funcs .marshal = func (b []byte , p pointer , _ *coderFieldInfo , opts marshalOptions ) ([]byte , error ) {
p , info := getInfo (p )
if info == nil || info .funcs .marshal == nil {
return b , nil
}
return info .funcs .marshal (b , p , info , opts )
}
first .funcs .merge = func (dst , src pointer , _ *coderFieldInfo , opts mergeOptions ) {
srcp , srcinfo := getInfo (src )
if srcinfo == nil || srcinfo .funcs .merge == nil {
return
}
dstp , dstinfo := getInfo (dst )
if dstinfo != srcinfo {
dst .AsValueOf (ft ).Elem ().Set (reflect .New (src .AsValueOf (ft ).Elem ().Elem ().Elem ().Type ()))
dstp = pointerOfValue (dst .AsValueOf (ft ).Elem ().Elem ()).Apply (zeroOffset )
}
srcinfo .funcs .merge (dstp , srcp , srcinfo , opts )
}
if needIsInit {
first .funcs .isInit = func (p pointer , _ *coderFieldInfo ) error {
p , info := getInfo (p )
if info == nil || info .funcs .isInit == nil {
return nil
}
return info .funcs .isInit (p , info )
}
}
}
func makeWeakMessageFieldCoder (fd pref .FieldDescriptor ) pointerCoderFuncs {
var once sync .Once
var messageType pref .MessageType
lazyInit := func () {
once .Do (func () {
messageName := fd .Message ().FullName ()
messageType , _ = preg .GlobalTypes .FindMessageByName (messageName )
})
}
return pointerCoderFuncs {
size : func (p pointer , f *coderFieldInfo , opts marshalOptions ) int {
m , ok := p .WeakFields ().get (f .num )
if !ok {
return 0
}
lazyInit ()
if messageType == nil {
panic (fmt .Sprintf ("weak message %v is not linked in" , fd .Message ().FullName ()))
}
return sizeMessage (m , f .tagsize , opts )
},
marshal : func (b []byte , p pointer , f *coderFieldInfo , opts marshalOptions ) ([]byte , error ) {
m , ok := p .WeakFields ().get (f .num )
if !ok {
return b , nil
}
lazyInit ()
if messageType == nil {
panic (fmt .Sprintf ("weak message %v is not linked in" , fd .Message ().FullName ()))
}
return appendMessage (b , m , f .wiretag , opts )
},
unmarshal : func (b []byte , p pointer , wtyp protowire .Type , f *coderFieldInfo , opts unmarshalOptions ) (unmarshalOutput , error ) {
fs := p .WeakFields ()
m , ok := fs .get (f .num )
if !ok {
lazyInit ()
if messageType == nil {
return unmarshalOutput {}, errUnknown
}
m = messageType .New ().Interface ()
fs .set (f .num , m )
}
return consumeMessage (b , m , wtyp , opts )
},
isInit : func (p pointer , f *coderFieldInfo ) error {
m , ok := p .WeakFields ().get (f .num )
if !ok {
return nil
}
return proto .CheckInitialized (m )
},
merge : func (dst , src pointer , f *coderFieldInfo , opts mergeOptions ) {
sm , ok := src .WeakFields ().get (f .num )
if !ok {
return
}
dm , ok := dst .WeakFields ().get (f .num )
if !ok {
lazyInit ()
if messageType == nil {
panic (fmt .Sprintf ("weak message %v is not linked in" , fd .Message ().FullName ()))
}
dm = messageType .New ().Interface ()
dst .WeakFields ().set (f .num , dm )
}
opts .Merge (dm , sm )
},
}
}
func makeMessageFieldCoder (fd pref .FieldDescriptor , ft reflect .Type ) pointerCoderFuncs {
if mi := getMessageInfo (ft ); mi != nil {
funcs := pointerCoderFuncs {
size : sizeMessageInfo ,
marshal : appendMessageInfo ,
unmarshal : consumeMessageInfo ,
merge : mergeMessage ,
}
if needsInitCheck (mi .Desc ) {
funcs .isInit = isInitMessageInfo
}
return funcs
} else {
return pointerCoderFuncs {
size : func (p pointer , f *coderFieldInfo , opts marshalOptions ) int {
m := asMessage (p .AsValueOf (ft ).Elem ())
return sizeMessage (m , f .tagsize , opts )
},
marshal : func (b []byte , p pointer , f *coderFieldInfo , opts marshalOptions ) ([]byte , error ) {
m := asMessage (p .AsValueOf (ft ).Elem ())
return appendMessage (b , m , f .wiretag , opts )
},
unmarshal : func (b []byte , p pointer , wtyp protowire .Type , f *coderFieldInfo , opts unmarshalOptions ) (unmarshalOutput , error ) {
mp := p .AsValueOf (ft ).Elem ()
if mp .IsNil () {
mp .Set (reflect .New (ft .Elem ()))
}
return consumeMessage (b , asMessage (mp ), wtyp , opts )
},
isInit : func (p pointer , f *coderFieldInfo ) error {
m := asMessage (p .AsValueOf (ft ).Elem ())
return proto .CheckInitialized (m )
},
merge : mergeMessage ,
}
}
}
func sizeMessageInfo (p pointer , f *coderFieldInfo , opts marshalOptions ) int {
return protowire .SizeBytes (f .mi .sizePointer (p .Elem (), opts )) + f .tagsize
}
func appendMessageInfo (b []byte , p pointer , f *coderFieldInfo , opts marshalOptions ) ([]byte , error ) {
b = protowire .AppendVarint (b , f .wiretag )
b = protowire .AppendVarint (b , uint64 (f .mi .sizePointer (p .Elem (), opts )))
return f .mi .marshalAppendPointer (b , p .Elem (), opts )
}
func consumeMessageInfo (b []byte , p pointer , wtyp protowire .Type , f *coderFieldInfo , opts unmarshalOptions ) (out unmarshalOutput , err error ) {
if wtyp != protowire .BytesType {
return out , errUnknown
}
v , n := protowire .ConsumeBytes (b )
if n < 0 {
return out , protowire .ParseError (n )
}
if p .Elem ().IsNil () {
p .SetPointer (pointerOfValue (reflect .New (f .mi .GoReflectType .Elem ())))
}
o , err := f .mi .unmarshalPointer (v , p .Elem (), 0 , opts )
if err != nil {
return out , err
}
out .n = n
out .initialized = o .initialized
return out , nil
}
func isInitMessageInfo (p pointer , f *coderFieldInfo ) error {
return f .mi .checkInitializedPointer (p .Elem ())
}
func sizeMessage (m proto .Message , tagsize int , _ marshalOptions ) int {
return protowire .SizeBytes (proto .Size (m )) + tagsize
}
func appendMessage (b []byte , m proto .Message , wiretag uint64 , opts marshalOptions ) ([]byte , error ) {
b = protowire .AppendVarint (b , wiretag )
b = protowire .AppendVarint (b , uint64 (proto .Size (m )))
return opts .Options ().MarshalAppend (b , m )
}
func consumeMessage (b []byte , m proto .Message , wtyp protowire .Type , opts unmarshalOptions ) (out unmarshalOutput , err error ) {
if wtyp != protowire .BytesType {
return out , errUnknown
}
v , n := protowire .ConsumeBytes (b )
if n < 0 {
return out , protowire .ParseError (n )
}
o , err := opts .Options ().UnmarshalState (piface .UnmarshalInput {
Buf : v ,
Message : m .ProtoReflect (),
})
if err != nil {
return out , err
}
out .n = n
out .initialized = o .Flags &piface .UnmarshalInitialized != 0
return out , nil
}
func sizeMessageValue (v pref .Value , tagsize int , opts marshalOptions ) int {
m := v .Message ().Interface ()
return sizeMessage (m , tagsize , opts )
}
func appendMessageValue (b []byte , v pref .Value , wiretag uint64 , opts marshalOptions ) ([]byte , error ) {
m := v .Message ().Interface ()
return appendMessage (b , m , wiretag , opts )
}
func consumeMessageValue (b []byte , v pref .Value , _ protowire .Number , wtyp protowire .Type , opts unmarshalOptions ) (pref .Value , unmarshalOutput , error ) {
m := v .Message ().Interface ()
out , err := consumeMessage (b , m , wtyp , opts )
return v , out , err
}
func isInitMessageValue (v pref .Value ) error {
m := v .Message ().Interface ()
return proto .CheckInitialized (m )
}
var coderMessageValue = valueCoderFuncs {
size : sizeMessageValue ,
marshal : appendMessageValue ,
unmarshal : consumeMessageValue ,
isInit : isInitMessageValue ,
merge : mergeMessageValue ,
}
func sizeGroupValue (v pref .Value , tagsize int , opts marshalOptions ) int {
m := v .Message ().Interface ()
return sizeGroup (m , tagsize , opts )
}
func appendGroupValue (b []byte , v pref .Value , wiretag uint64 , opts marshalOptions ) ([]byte , error ) {
m := v .Message ().Interface ()
return appendGroup (b , m , wiretag , opts )
}
func consumeGroupValue (b []byte , v pref .Value , num protowire .Number , wtyp protowire .Type , opts unmarshalOptions ) (pref .Value , unmarshalOutput , error ) {
m := v .Message ().Interface ()
out , err := consumeGroup (b , m , num , wtyp , opts )
return v , out , err
}
var coderGroupValue = valueCoderFuncs {
size : sizeGroupValue ,
marshal : appendGroupValue ,
unmarshal : consumeGroupValue ,
isInit : isInitMessageValue ,
merge : mergeMessageValue ,
}
func makeGroupFieldCoder (fd pref .FieldDescriptor , ft reflect .Type ) pointerCoderFuncs {
num := fd .Number ()
if mi := getMessageInfo (ft ); mi != nil {
funcs := pointerCoderFuncs {
size : sizeGroupType ,
marshal : appendGroupType ,
unmarshal : consumeGroupType ,
merge : mergeMessage ,
}
if needsInitCheck (mi .Desc ) {
funcs .isInit = isInitMessageInfo
}
return funcs
} else {
return pointerCoderFuncs {
size : func (p pointer , f *coderFieldInfo , opts marshalOptions ) int {
m := asMessage (p .AsValueOf (ft ).Elem ())
return sizeGroup (m , f .tagsize , opts )
},
marshal : func (b []byte , p pointer , f *coderFieldInfo , opts marshalOptions ) ([]byte , error ) {
m := asMessage (p .AsValueOf (ft ).Elem ())
return appendGroup (b , m , f .wiretag , opts )
},
unmarshal : func (b []byte , p pointer , wtyp protowire .Type , f *coderFieldInfo , opts unmarshalOptions ) (unmarshalOutput , error ) {
mp := p .AsValueOf (ft ).Elem ()
if mp .IsNil () {
mp .Set (reflect .New (ft .Elem ()))
}
return consumeGroup (b , asMessage (mp ), num , wtyp , opts )
},
isInit : func (p pointer , f *coderFieldInfo ) error {
m := asMessage (p .AsValueOf (ft ).Elem ())
return proto .CheckInitialized (m )
},
merge : mergeMessage ,
}
}
}
func sizeGroupType (p pointer , f *coderFieldInfo , opts marshalOptions ) int {
return 2 *f .tagsize + f .mi .sizePointer (p .Elem (), opts )
}
func appendGroupType (b []byte , p pointer , f *coderFieldInfo , opts marshalOptions ) ([]byte , error ) {
b = protowire .AppendVarint (b , f .wiretag )
b , err := f .mi .marshalAppendPointer (b , p .Elem (), opts )
b = protowire .AppendVarint (b , f .wiretag +1 )
return b , err
}
func consumeGroupType (b []byte , p pointer , wtyp protowire .Type , f *coderFieldInfo , opts unmarshalOptions ) (out unmarshalOutput , err error ) {
if wtyp != protowire .StartGroupType {
return out , errUnknown
}
if p .Elem ().IsNil () {
p .SetPointer (pointerOfValue (reflect .New (f .mi .GoReflectType .Elem ())))
}
return f .mi .unmarshalPointer (b , p .Elem (), f .num , opts )
}
func sizeGroup (m proto .Message , tagsize int , _ marshalOptions ) int {
return 2 *tagsize + proto .Size (m )
}
func appendGroup (b []byte , m proto .Message , wiretag uint64 , opts marshalOptions ) ([]byte , error ) {
b = protowire .AppendVarint (b , wiretag )
b , err := opts .Options ().MarshalAppend (b , m )
b = protowire .AppendVarint (b , wiretag +1 )
return b , err
}
func consumeGroup (b []byte , m proto .Message , num protowire .Number , wtyp protowire .Type , opts unmarshalOptions ) (out unmarshalOutput , err error ) {
if wtyp != protowire .StartGroupType {
return out , errUnknown
}
b , n := protowire .ConsumeGroup (num , b )
if n < 0 {
return out , protowire .ParseError (n )
}
o , err := opts .Options ().UnmarshalState (piface .UnmarshalInput {
Buf : b ,
Message : m .ProtoReflect (),
})
if err != nil {
return out , err
}
out .n = n
out .initialized = o .Flags &piface .UnmarshalInitialized != 0
return out , nil
}
func makeMessageSliceFieldCoder (fd pref .FieldDescriptor , ft reflect .Type ) pointerCoderFuncs {
if mi := getMessageInfo (ft ); mi != nil {
funcs := pointerCoderFuncs {
size : sizeMessageSliceInfo ,
marshal : appendMessageSliceInfo ,
unmarshal : consumeMessageSliceInfo ,
merge : mergeMessageSlice ,
}
if needsInitCheck (mi .Desc ) {
funcs .isInit = isInitMessageSliceInfo
}
return funcs
}
return pointerCoderFuncs {
size : func (p pointer , f *coderFieldInfo , opts marshalOptions ) int {
return sizeMessageSlice (p , ft , f .tagsize , opts )
},
marshal : func (b []byte , p pointer , f *coderFieldInfo , opts marshalOptions ) ([]byte , error ) {
return appendMessageSlice (b , p , f .wiretag , ft , opts )
},
unmarshal : func (b []byte , p pointer , wtyp protowire .Type , f *coderFieldInfo , opts unmarshalOptions ) (unmarshalOutput , error ) {
return consumeMessageSlice (b , p , ft , wtyp , opts )
},
isInit : func (p pointer , f *coderFieldInfo ) error {
return isInitMessageSlice (p , ft )
},
merge : mergeMessageSlice ,
}
}
func sizeMessageSliceInfo (p pointer , f *coderFieldInfo , opts marshalOptions ) int {
s := p .PointerSlice ()
n := 0
for _ , v := range s {
n += protowire .SizeBytes (f .mi .sizePointer (v , opts )) + f .tagsize
}
return n
}
func appendMessageSliceInfo (b []byte , p pointer , f *coderFieldInfo , opts marshalOptions ) ([]byte , error ) {
s := p .PointerSlice ()
var err error
for _ , v := range s {
b = protowire .AppendVarint (b , f .wiretag )
siz := f .mi .sizePointer (v , opts )
b = protowire .AppendVarint (b , uint64 (siz ))
b , err = f .mi .marshalAppendPointer (b , v , opts )
if err != nil {
return b , err
}
}
return b , nil
}
func consumeMessageSliceInfo (b []byte , p pointer , wtyp protowire .Type , f *coderFieldInfo , opts unmarshalOptions ) (out unmarshalOutput , err error ) {
if wtyp != protowire .BytesType {
return out , errUnknown
}
v , n := protowire .ConsumeBytes (b )
if n < 0 {
return out , protowire .ParseError (n )
}
m := reflect .New (f .mi .GoReflectType .Elem ()).Interface ()
mp := pointerOfIface (m )
o , err := f .mi .unmarshalPointer (v , mp , 0 , opts )
if err != nil {
return out , err
}
p .AppendPointerSlice (mp )
out .n = n
out .initialized = o .initialized
return out , nil
}
func isInitMessageSliceInfo (p pointer , f *coderFieldInfo ) error {
s := p .PointerSlice ()
for _ , v := range s {
if err := f .mi .checkInitializedPointer (v ); err != nil {
return err
}
}
return nil
}
func sizeMessageSlice (p pointer , goType reflect .Type , tagsize int , _ marshalOptions ) int {
s := p .PointerSlice ()
n := 0
for _ , v := range s {
m := asMessage (v .AsValueOf (goType .Elem ()))
n += protowire .SizeBytes (proto .Size (m )) + tagsize
}
return n
}
func appendMessageSlice (b []byte , p pointer , wiretag uint64 , goType reflect .Type , opts marshalOptions ) ([]byte , error ) {
s := p .PointerSlice ()
var err error
for _ , v := range s {
m := asMessage (v .AsValueOf (goType .Elem ()))
b = protowire .AppendVarint (b , wiretag )
siz := proto .Size (m )
b = protowire .AppendVarint (b , uint64 (siz ))
b , err = opts .Options ().MarshalAppend (b , m )
if err != nil {
return b , err
}
}
return b , nil
}
func consumeMessageSlice (b []byte , p pointer , goType reflect .Type , wtyp protowire .Type , opts unmarshalOptions ) (out unmarshalOutput , err error ) {
if wtyp != protowire .BytesType {
return out , errUnknown
}
v , n := protowire .ConsumeBytes (b )
if n < 0 {
return out , protowire .ParseError (n )
}
mp := reflect .New (goType .Elem ())
o , err := opts .Options ().UnmarshalState (piface .UnmarshalInput {
Buf : v ,
Message : asMessage (mp ).ProtoReflect (),
})
if err != nil {
return out , err
}
p .AppendPointerSlice (pointerOfValue (mp ))
out .n = n
out .initialized = o .Flags &piface .UnmarshalInitialized != 0
return out , nil
}
func isInitMessageSlice (p pointer , goType reflect .Type ) error {
s := p .PointerSlice ()
for _ , v := range s {
m := asMessage (v .AsValueOf (goType .Elem ()))
if err := proto .CheckInitialized (m ); err != nil {
return err
}
}
return nil
}