...

Source file src/github.com/golang/protobuf/proto/proto.go

Documentation: github.com/golang/protobuf/proto

     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  

View as plain text