package proto
import (
"math"
"unicode/utf8"
"google.golang.org/protobuf/encoding/protowire"
"google.golang.org/protobuf/internal/errors"
"google.golang.org/protobuf/internal/strs"
"google.golang.org/protobuf/reflect/protoreflect"
)
func (o UnmarshalOptions ) unmarshalScalar (b []byte , wtyp protowire .Type , fd protoreflect .FieldDescriptor ) (val protoreflect .Value , n int , err error ) {
switch fd .Kind () {
case protoreflect .BoolKind :
if wtyp != protowire .VarintType {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfBool (protowire .DecodeBool (v )), n , nil
case protoreflect .EnumKind :
if wtyp != protowire .VarintType {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfEnum (protoreflect .EnumNumber (v )), n , nil
case protoreflect .Int32Kind :
if wtyp != protowire .VarintType {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfInt32 (int32 (v )), n , nil
case protoreflect .Sint32Kind :
if wtyp != protowire .VarintType {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfInt32 (int32 (protowire .DecodeZigZag (v & math .MaxUint32 ))), n , nil
case protoreflect .Uint32Kind :
if wtyp != protowire .VarintType {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfUint32 (uint32 (v )), n , nil
case protoreflect .Int64Kind :
if wtyp != protowire .VarintType {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfInt64 (int64 (v )), n , nil
case protoreflect .Sint64Kind :
if wtyp != protowire .VarintType {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfInt64 (protowire .DecodeZigZag (v )), n , nil
case protoreflect .Uint64Kind :
if wtyp != protowire .VarintType {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfUint64 (v ), n , nil
case protoreflect .Sfixed32Kind :
if wtyp != protowire .Fixed32Type {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeFixed32 (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfInt32 (int32 (v )), n , nil
case protoreflect .Fixed32Kind :
if wtyp != protowire .Fixed32Type {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeFixed32 (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfUint32 (uint32 (v )), n , nil
case protoreflect .FloatKind :
if wtyp != protowire .Fixed32Type {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeFixed32 (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfFloat32 (math .Float32frombits (uint32 (v ))), n , nil
case protoreflect .Sfixed64Kind :
if wtyp != protowire .Fixed64Type {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeFixed64 (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfInt64 (int64 (v )), n , nil
case protoreflect .Fixed64Kind :
if wtyp != protowire .Fixed64Type {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeFixed64 (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfUint64 (v ), n , nil
case protoreflect .DoubleKind :
if wtyp != protowire .Fixed64Type {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeFixed64 (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfFloat64 (math .Float64frombits (v )), n , nil
case protoreflect .StringKind :
if wtyp != protowire .BytesType {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeBytes (b )
if n < 0 {
return val , 0 , errDecode
}
if strs .EnforceUTF8 (fd ) && !utf8 .Valid (v ) {
return protoreflect .Value {}, 0 , errors .InvalidUTF8 (string (fd .FullName ()))
}
return protoreflect .ValueOfString (string (v )), n , nil
case protoreflect .BytesKind :
if wtyp != protowire .BytesType {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeBytes (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfBytes (append (emptyBuf [:], v ...)), n , nil
case protoreflect .MessageKind :
if wtyp != protowire .BytesType {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeBytes (b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfBytes (v ), n , nil
case protoreflect .GroupKind :
if wtyp != protowire .StartGroupType {
return val , 0 , errUnknown
}
v , n := protowire .ConsumeGroup (fd .Number (), b )
if n < 0 {
return val , 0 , errDecode
}
return protoreflect .ValueOfBytes (v ), n , nil
default :
return val , 0 , errUnknown
}
}
func (o UnmarshalOptions ) unmarshalList (b []byte , wtyp protowire .Type , list protoreflect .List , fd protoreflect .FieldDescriptor ) (n int , err error ) {
switch fd .Kind () {
case protoreflect .BoolKind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeVarint (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfBool (protowire .DecodeBool (v )))
}
return n , nil
}
if wtyp != protowire .VarintType {
return 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfBool (protowire .DecodeBool (v )))
return n , nil
case protoreflect .EnumKind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeVarint (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfEnum (protoreflect .EnumNumber (v )))
}
return n , nil
}
if wtyp != protowire .VarintType {
return 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfEnum (protoreflect .EnumNumber (v )))
return n , nil
case protoreflect .Int32Kind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeVarint (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfInt32 (int32 (v )))
}
return n , nil
}
if wtyp != protowire .VarintType {
return 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfInt32 (int32 (v )))
return n , nil
case protoreflect .Sint32Kind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeVarint (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfInt32 (int32 (protowire .DecodeZigZag (v & math .MaxUint32 ))))
}
return n , nil
}
if wtyp != protowire .VarintType {
return 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfInt32 (int32 (protowire .DecodeZigZag (v & math .MaxUint32 ))))
return n , nil
case protoreflect .Uint32Kind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeVarint (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfUint32 (uint32 (v )))
}
return n , nil
}
if wtyp != protowire .VarintType {
return 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfUint32 (uint32 (v )))
return n , nil
case protoreflect .Int64Kind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeVarint (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfInt64 (int64 (v )))
}
return n , nil
}
if wtyp != protowire .VarintType {
return 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfInt64 (int64 (v )))
return n , nil
case protoreflect .Sint64Kind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeVarint (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfInt64 (protowire .DecodeZigZag (v )))
}
return n , nil
}
if wtyp != protowire .VarintType {
return 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfInt64 (protowire .DecodeZigZag (v )))
return n , nil
case protoreflect .Uint64Kind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeVarint (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfUint64 (v ))
}
return n , nil
}
if wtyp != protowire .VarintType {
return 0 , errUnknown
}
v , n := protowire .ConsumeVarint (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfUint64 (v ))
return n , nil
case protoreflect .Sfixed32Kind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeFixed32 (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfInt32 (int32 (v )))
}
return n , nil
}
if wtyp != protowire .Fixed32Type {
return 0 , errUnknown
}
v , n := protowire .ConsumeFixed32 (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfInt32 (int32 (v )))
return n , nil
case protoreflect .Fixed32Kind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeFixed32 (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfUint32 (uint32 (v )))
}
return n , nil
}
if wtyp != protowire .Fixed32Type {
return 0 , errUnknown
}
v , n := protowire .ConsumeFixed32 (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfUint32 (uint32 (v )))
return n , nil
case protoreflect .FloatKind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeFixed32 (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfFloat32 (math .Float32frombits (uint32 (v ))))
}
return n , nil
}
if wtyp != protowire .Fixed32Type {
return 0 , errUnknown
}
v , n := protowire .ConsumeFixed32 (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfFloat32 (math .Float32frombits (uint32 (v ))))
return n , nil
case protoreflect .Sfixed64Kind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeFixed64 (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfInt64 (int64 (v )))
}
return n , nil
}
if wtyp != protowire .Fixed64Type {
return 0 , errUnknown
}
v , n := protowire .ConsumeFixed64 (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfInt64 (int64 (v )))
return n , nil
case protoreflect .Fixed64Kind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeFixed64 (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfUint64 (v ))
}
return n , nil
}
if wtyp != protowire .Fixed64Type {
return 0 , errUnknown
}
v , n := protowire .ConsumeFixed64 (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfUint64 (v ))
return n , nil
case protoreflect .DoubleKind :
if wtyp == protowire .BytesType {
buf , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
for len (buf ) > 0 {
v , n := protowire .ConsumeFixed64 (buf )
if n < 0 {
return 0 , errDecode
}
buf = buf [n :]
list .Append (protoreflect .ValueOfFloat64 (math .Float64frombits (v )))
}
return n , nil
}
if wtyp != protowire .Fixed64Type {
return 0 , errUnknown
}
v , n := protowire .ConsumeFixed64 (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfFloat64 (math .Float64frombits (v )))
return n , nil
case protoreflect .StringKind :
if wtyp != protowire .BytesType {
return 0 , errUnknown
}
v , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
if strs .EnforceUTF8 (fd ) && !utf8 .Valid (v ) {
return 0 , errors .InvalidUTF8 (string (fd .FullName ()))
}
list .Append (protoreflect .ValueOfString (string (v )))
return n , nil
case protoreflect .BytesKind :
if wtyp != protowire .BytesType {
return 0 , errUnknown
}
v , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
list .Append (protoreflect .ValueOfBytes (append (emptyBuf [:], v ...)))
return n , nil
case protoreflect .MessageKind :
if wtyp != protowire .BytesType {
return 0 , errUnknown
}
v , n := protowire .ConsumeBytes (b )
if n < 0 {
return 0 , errDecode
}
m := list .NewElement ()
if err := o .unmarshalMessage (v , m .Message ()); err != nil {
return 0 , err
}
list .Append (m )
return n , nil
case protoreflect .GroupKind :
if wtyp != protowire .StartGroupType {
return 0 , errUnknown
}
v , n := protowire .ConsumeGroup (fd .Number (), b )
if n < 0 {
return 0 , errDecode
}
m := list .NewElement ()
if err := o .unmarshalMessage (v , m .Message ()); err != nil {
return 0 , err
}
list .Append (m )
return n , nil
default :
return 0 , errUnknown
}
}
var emptyBuf [0 ]byte
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .