proto.go (6004B)
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 }