github.com/cloudwego/dynamicgo@v0.2.6-0.20240519101509-707f41b6b834/proto/binary/binary_skip.go (about) 1 package binary 2 3 import ( 4 "github.com/cloudwego/dynamicgo/proto" 5 "github.com/cloudwego/dynamicgo/proto/protowire" 6 ) 7 8 func (p *BinaryProtocol) SkipFixed32Type() (int, error) { 9 _, err := p.next(4) 10 return 4, err 11 } 12 13 func (p *BinaryProtocol) SkipFixed64Type() (int, error) { 14 _, err := p.next(8) 15 return 8, err 16 } 17 18 func (p *BinaryProtocol) SkipBytesType() (int, error) { 19 v, n := protowire.ConsumeVarint((p.Buf)[p.Read:]) 20 if n < 0 { 21 return n, errDecodeField 22 } 23 all := int(v) + n 24 _, err := p.next(all) 25 return all, err 26 } 27 28 // skip (L)V once by wireType, useNative is not implemented 29 func (p *BinaryProtocol) Skip(wireType proto.WireType, useNative bool) (err error) { 30 switch wireType { 31 case proto.VarintType: 32 _, err = p.ReadVarint() 33 case proto.Fixed32Type: 34 _, err = p.SkipFixed32Type() // the same as p.ReadFixed32Type() but without slice bytes 35 case proto.Fixed64Type: 36 _, err = p.SkipFixed64Type() // the same as p.ReadFixed64Type() but without slice bytes 37 case proto.BytesType: 38 _, err = p.SkipBytesType() // the same as p.ReadBytesType() but without slice bytes 39 } 40 return 41 } 42 43 // fast skip all elements in LIST/MAP 44 func (p *BinaryProtocol) SkipAllElements(fieldNumber proto.FieldNumber, ispacked bool) (size int, err error) { 45 size = 0 46 if ispacked { 47 if _, _, _, err := p.ConsumeTag(); err != nil { 48 return -1, err 49 } 50 bytelen, err := p.ReadLength() 51 if err != nil { 52 return -1, err 53 } 54 start := p.Read 55 for p.Read < start+int(bytelen) { 56 if _, err := p.ReadVarint(); err != nil { 57 return -1, err 58 } 59 size++ 60 } 61 } else { 62 for p.Read < len(p.Buf) { 63 elementFieldNumber, ewt, n, err := p.ConsumeTagWithoutMove() 64 if err != nil { 65 return -1, err 66 } 67 if elementFieldNumber != fieldNumber { 68 break 69 } 70 if _, moveTagErr := p.next(n); moveTagErr != nil { 71 return -1, moveTagErr 72 } 73 if err = p.Skip(ewt, false); err != nil { 74 return -1, err 75 } 76 size++ 77 } 78 } 79 80 return size, nil 81 }