gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }