wire.go (1905B)
1 // Copyright 2019 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package proto 6 7 import ( 8 protoV2 "google.golang.org/protobuf/proto" 9 "google.golang.org/protobuf/runtime/protoiface" 10 ) 11 12 // Size returns the size in bytes of the wire-format encoding of m. 13 func Size(m Message) int { 14 if m == nil { 15 return 0 16 } 17 mi := MessageV2(m) 18 return protoV2.Size(mi) 19 } 20 21 // Marshal returns the wire-format encoding of m. 22 func Marshal(m Message) ([]byte, error) { 23 b, err := marshalAppend(nil, m, false) 24 if b == nil { 25 b = zeroBytes 26 } 27 return b, err 28 } 29 30 var zeroBytes = make([]byte, 0, 0) 31 32 func marshalAppend(buf []byte, m Message, deterministic bool) ([]byte, error) { 33 if m == nil { 34 return nil, ErrNil 35 } 36 mi := MessageV2(m) 37 nbuf, err := protoV2.MarshalOptions{ 38 Deterministic: deterministic, 39 AllowPartial: true, 40 }.MarshalAppend(buf, mi) 41 if err != nil { 42 return buf, err 43 } 44 if len(buf) == len(nbuf) { 45 if !mi.ProtoReflect().IsValid() { 46 return buf, ErrNil 47 } 48 } 49 return nbuf, checkRequiredNotSet(mi) 50 } 51 52 // Unmarshal parses a wire-format message in b and places the decoded results in m. 53 // 54 // Unmarshal resets m before starting to unmarshal, so any existing data in m is always 55 // removed. Use UnmarshalMerge to preserve and append to existing data. 56 func Unmarshal(b []byte, m Message) error { 57 m.Reset() 58 return UnmarshalMerge(b, m) 59 } 60 61 // UnmarshalMerge parses a wire-format message in b and places the decoded results in m. 62 func UnmarshalMerge(b []byte, m Message) error { 63 mi := MessageV2(m) 64 out, err := protoV2.UnmarshalOptions{ 65 AllowPartial: true, 66 Merge: true, 67 }.UnmarshalState(protoiface.UnmarshalInput{ 68 Buf: b, 69 Message: mi.ProtoReflect(), 70 }) 71 if err != nil { 72 return err 73 } 74 if out.Flags&protoiface.UnmarshalInitialized > 0 { 75 return nil 76 } 77 return checkRequiredNotSet(mi) 78 }