proto.go raw

   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 provides functionality for handling protocol buffer messages.
   6  // In particular, it provides marshaling and unmarshaling between a protobuf
   7  // message and the binary wire format.
   8  //
   9  // See https://developers.google.com/protocol-buffers/docs/gotutorial for
  10  // more information.
  11  //
  12  // Deprecated: Use the "google.golang.org/protobuf/proto" package instead.
  13  package proto
  14  
  15  import (
  16  	protoV2 "google.golang.org/protobuf/proto"
  17  	"google.golang.org/protobuf/reflect/protoreflect"
  18  	"google.golang.org/protobuf/runtime/protoiface"
  19  	"google.golang.org/protobuf/runtime/protoimpl"
  20  )
  21  
  22  const (
  23  	ProtoPackageIsVersion1 = true
  24  	ProtoPackageIsVersion2 = true
  25  	ProtoPackageIsVersion3 = true
  26  	ProtoPackageIsVersion4 = true
  27  )
  28  
  29  // GeneratedEnum is any enum type generated by protoc-gen-go
  30  // which is a named int32 kind.
  31  // This type exists for documentation purposes.
  32  type GeneratedEnum interface{}
  33  
  34  // GeneratedMessage is any message type generated by protoc-gen-go
  35  // which is a pointer to a named struct kind.
  36  // This type exists for documentation purposes.
  37  type GeneratedMessage interface{}
  38  
  39  // Message is a protocol buffer message.
  40  //
  41  // This is the v1 version of the message interface and is marginally better
  42  // than an empty interface as it lacks any method to programatically interact
  43  // with the contents of the message.
  44  //
  45  // A v2 message is declared in "google.golang.org/protobuf/proto".Message and
  46  // exposes protobuf reflection as a first-class feature of the interface.
  47  //
  48  // To convert a v1 message to a v2 message, use the MessageV2 function.
  49  // To convert a v2 message to a v1 message, use the MessageV1 function.
  50  type Message = protoiface.MessageV1
  51  
  52  // MessageV1 converts either a v1 or v2 message to a v1 message.
  53  // It returns nil if m is nil.
  54  func MessageV1(m GeneratedMessage) protoiface.MessageV1 {
  55  	return protoimpl.X.ProtoMessageV1Of(m)
  56  }
  57  
  58  // MessageV2 converts either a v1 or v2 message to a v2 message.
  59  // It returns nil if m is nil.
  60  func MessageV2(m GeneratedMessage) protoV2.Message {
  61  	return protoimpl.X.ProtoMessageV2Of(m)
  62  }
  63  
  64  // MessageReflect returns a reflective view for a message.
  65  // It returns nil if m is nil.
  66  func MessageReflect(m Message) protoreflect.Message {
  67  	return protoimpl.X.MessageOf(m)
  68  }
  69  
  70  // Marshaler is implemented by messages that can marshal themselves.
  71  // This interface is used by the following functions: Size, Marshal,
  72  // Buffer.Marshal, and Buffer.EncodeMessage.
  73  //
  74  // Deprecated: Do not implement.
  75  type Marshaler interface {
  76  	// Marshal formats the encoded bytes of the message.
  77  	// It should be deterministic and emit valid protobuf wire data.
  78  	// The caller takes ownership of the returned buffer.
  79  	Marshal() ([]byte, error)
  80  }
  81  
  82  // Unmarshaler is implemented by messages that can unmarshal themselves.
  83  // This interface is used by the following functions: Unmarshal, UnmarshalMerge,
  84  // Buffer.Unmarshal, Buffer.DecodeMessage, and Buffer.DecodeGroup.
  85  //
  86  // Deprecated: Do not implement.
  87  type Unmarshaler interface {
  88  	// Unmarshal parses the encoded bytes of the protobuf wire input.
  89  	// The provided buffer is only valid for during method call.
  90  	// It should not reset the receiver message.
  91  	Unmarshal([]byte) error
  92  }
  93  
  94  // Merger is implemented by messages that can merge themselves.
  95  // This interface is used by the following functions: Clone and Merge.
  96  //
  97  // Deprecated: Do not implement.
  98  type Merger interface {
  99  	// Merge merges the contents of src into the receiver message.
 100  	// It clones all data structures in src such that it aliases no mutable
 101  	// memory referenced by src.
 102  	Merge(src Message)
 103  }
 104  
 105  // RequiredNotSetError is an error type returned when
 106  // marshaling or unmarshaling a message with missing required fields.
 107  type RequiredNotSetError struct {
 108  	err error
 109  }
 110  
 111  func (e *RequiredNotSetError) Error() string {
 112  	if e.err != nil {
 113  		return e.err.Error()
 114  	}
 115  	return "proto: required field not set"
 116  }
 117  func (e *RequiredNotSetError) RequiredNotSet() bool {
 118  	return true
 119  }
 120  
 121  func checkRequiredNotSet(m protoV2.Message) error {
 122  	if err := protoV2.CheckInitialized(m); err != nil {
 123  		return &RequiredNotSetError{err: err}
 124  	}
 125  	return nil
 126  }
 127  
 128  // Clone returns a deep copy of src.
 129  func Clone(src Message) Message {
 130  	return MessageV1(protoV2.Clone(MessageV2(src)))
 131  }
 132  
 133  // Merge merges src into dst, which must be messages of the same type.
 134  //
 135  // Populated scalar fields in src are copied to dst, while populated
 136  // singular messages in src are merged into dst by recursively calling Merge.
 137  // The elements of every list field in src is appended to the corresponded
 138  // list fields in dst. The entries of every map field in src is copied into
 139  // the corresponding map field in dst, possibly replacing existing entries.
 140  // The unknown fields of src are appended to the unknown fields of dst.
 141  func Merge(dst, src Message) {
 142  	protoV2.Merge(MessageV2(dst), MessageV2(src))
 143  }
 144  
 145  // Equal reports whether two messages are equal.
 146  // If two messages marshal to the same bytes under deterministic serialization,
 147  // then Equal is guaranteed to report true.
 148  //
 149  // Two messages are equal if they are the same protobuf message type,
 150  // have the same set of populated known and extension field values,
 151  // and the same set of unknown fields values.
 152  //
 153  // Scalar values are compared with the equivalent of the == operator in Go,
 154  // except bytes values which are compared using bytes.Equal and
 155  // floating point values which specially treat NaNs as equal.
 156  // Message values are compared by recursively calling Equal.
 157  // Lists are equal if each element value is also equal.
 158  // Maps are equal if they have the same set of keys, where the pair of values
 159  // for each key is also equal.
 160  func Equal(x, y Message) bool {
 161  	return protoV2.Equal(MessageV2(x), MessageV2(y))
 162  }
 163  
 164  func isMessageSet(md protoreflect.MessageDescriptor) bool {
 165  	ms, ok := md.(interface{ IsMessageSet() bool })
 166  	return ok && ms.IsMessageSet()
 167  }
 168