gtsocial-umbx

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

value.go (11221B)


      1 // Copyright 2018 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 protoreflect
      6 
      7 import "google.golang.org/protobuf/encoding/protowire"
      8 
      9 // Enum is a reflection interface for a concrete enum value,
     10 // which provides type information and a getter for the enum number.
     11 // Enum does not provide a mutable API since enums are commonly backed by
     12 // Go constants, which are not addressable.
     13 type Enum interface {
     14 	// Descriptor returns enum descriptor, which contains only the protobuf
     15 	// type information for the enum.
     16 	Descriptor() EnumDescriptor
     17 
     18 	// Type returns the enum type, which encapsulates both Go and protobuf
     19 	// type information. If the Go type information is not needed,
     20 	// it is recommended that the enum descriptor be used instead.
     21 	Type() EnumType
     22 
     23 	// Number returns the enum value as an integer.
     24 	Number() EnumNumber
     25 }
     26 
     27 // Message is a reflective interface for a concrete message value,
     28 // encapsulating both type and value information for the message.
     29 //
     30 // Accessor/mutators for individual fields are keyed by FieldDescriptor.
     31 // For non-extension fields, the descriptor must exactly match the
     32 // field known by the parent message.
     33 // For extension fields, the descriptor must implement ExtensionTypeDescriptor,
     34 // extend the parent message (i.e., have the same message FullName), and
     35 // be within the parent's extension range.
     36 //
     37 // Each field Value can be a scalar or a composite type (Message, List, or Map).
     38 // See Value for the Go types associated with a FieldDescriptor.
     39 // Providing a Value that is invalid or of an incorrect type panics.
     40 type Message interface {
     41 	// Descriptor returns message descriptor, which contains only the protobuf
     42 	// type information for the message.
     43 	Descriptor() MessageDescriptor
     44 
     45 	// Type returns the message type, which encapsulates both Go and protobuf
     46 	// type information. If the Go type information is not needed,
     47 	// it is recommended that the message descriptor be used instead.
     48 	Type() MessageType
     49 
     50 	// New returns a newly allocated and mutable empty message.
     51 	New() Message
     52 
     53 	// Interface unwraps the message reflection interface and
     54 	// returns the underlying ProtoMessage interface.
     55 	Interface() ProtoMessage
     56 
     57 	// Range iterates over every populated field in an undefined order,
     58 	// calling f for each field descriptor and value encountered.
     59 	// Range returns immediately if f returns false.
     60 	// While iterating, mutating operations may only be performed
     61 	// on the current field descriptor.
     62 	Range(f func(FieldDescriptor, Value) bool)
     63 
     64 	// Has reports whether a field is populated.
     65 	//
     66 	// Some fields have the property of nullability where it is possible to
     67 	// distinguish between the default value of a field and whether the field
     68 	// was explicitly populated with the default value. Singular message fields,
     69 	// member fields of a oneof, and proto2 scalar fields are nullable. Such
     70 	// fields are populated only if explicitly set.
     71 	//
     72 	// In other cases (aside from the nullable cases above),
     73 	// a proto3 scalar field is populated if it contains a non-zero value, and
     74 	// a repeated field is populated if it is non-empty.
     75 	Has(FieldDescriptor) bool
     76 
     77 	// Clear clears the field such that a subsequent Has call reports false.
     78 	//
     79 	// Clearing an extension field clears both the extension type and value
     80 	// associated with the given field number.
     81 	//
     82 	// Clear is a mutating operation and unsafe for concurrent use.
     83 	Clear(FieldDescriptor)
     84 
     85 	// Get retrieves the value for a field.
     86 	//
     87 	// For unpopulated scalars, it returns the default value, where
     88 	// the default value of a bytes scalar is guaranteed to be a copy.
     89 	// For unpopulated composite types, it returns an empty, read-only view
     90 	// of the value; to obtain a mutable reference, use Mutable.
     91 	Get(FieldDescriptor) Value
     92 
     93 	// Set stores the value for a field.
     94 	//
     95 	// For a field belonging to a oneof, it implicitly clears any other field
     96 	// that may be currently set within the same oneof.
     97 	// For extension fields, it implicitly stores the provided ExtensionType.
     98 	// When setting a composite type, it is unspecified whether the stored value
     99 	// aliases the source's memory in any way. If the composite value is an
    100 	// empty, read-only value, then it panics.
    101 	//
    102 	// Set is a mutating operation and unsafe for concurrent use.
    103 	Set(FieldDescriptor, Value)
    104 
    105 	// Mutable returns a mutable reference to a composite type.
    106 	//
    107 	// If the field is unpopulated, it may allocate a composite value.
    108 	// For a field belonging to a oneof, it implicitly clears any other field
    109 	// that may be currently set within the same oneof.
    110 	// For extension fields, it implicitly stores the provided ExtensionType
    111 	// if not already stored.
    112 	// It panics if the field does not contain a composite type.
    113 	//
    114 	// Mutable is a mutating operation and unsafe for concurrent use.
    115 	Mutable(FieldDescriptor) Value
    116 
    117 	// NewField returns a new value that is assignable to the field
    118 	// for the given descriptor. For scalars, this returns the default value.
    119 	// For lists, maps, and messages, this returns a new, empty, mutable value.
    120 	NewField(FieldDescriptor) Value
    121 
    122 	// WhichOneof reports which field within the oneof is populated,
    123 	// returning nil if none are populated.
    124 	// It panics if the oneof descriptor does not belong to this message.
    125 	WhichOneof(OneofDescriptor) FieldDescriptor
    126 
    127 	// GetUnknown retrieves the entire list of unknown fields.
    128 	// The caller may only mutate the contents of the RawFields
    129 	// if the mutated bytes are stored back into the message with SetUnknown.
    130 	GetUnknown() RawFields
    131 
    132 	// SetUnknown stores an entire list of unknown fields.
    133 	// The raw fields must be syntactically valid according to the wire format.
    134 	// An implementation may panic if this is not the case.
    135 	// Once stored, the caller must not mutate the content of the RawFields.
    136 	// An empty RawFields may be passed to clear the fields.
    137 	//
    138 	// SetUnknown is a mutating operation and unsafe for concurrent use.
    139 	SetUnknown(RawFields)
    140 
    141 	// IsValid reports whether the message is valid.
    142 	//
    143 	// An invalid message is an empty, read-only value.
    144 	//
    145 	// An invalid message often corresponds to a nil pointer of the concrete
    146 	// message type, but the details are implementation dependent.
    147 	// Validity is not part of the protobuf data model, and may not
    148 	// be preserved in marshaling or other operations.
    149 	IsValid() bool
    150 
    151 	// ProtoMethods returns optional fast-path implementations of various operations.
    152 	// This method may return nil.
    153 	//
    154 	// The returned methods type is identical to
    155 	// "google.golang.org/protobuf/runtime/protoiface".Methods.
    156 	// Consult the protoiface package documentation for details.
    157 	ProtoMethods() *methods
    158 }
    159 
    160 // RawFields is the raw bytes for an ordered sequence of fields.
    161 // Each field contains both the tag (representing field number and wire type),
    162 // and also the wire data itself.
    163 type RawFields []byte
    164 
    165 // IsValid reports whether b is syntactically correct wire format.
    166 func (b RawFields) IsValid() bool {
    167 	for len(b) > 0 {
    168 		_, _, n := protowire.ConsumeField(b)
    169 		if n < 0 {
    170 			return false
    171 		}
    172 		b = b[n:]
    173 	}
    174 	return true
    175 }
    176 
    177 // List is a zero-indexed, ordered list.
    178 // The element Value type is determined by FieldDescriptor.Kind.
    179 // Providing a Value that is invalid or of an incorrect type panics.
    180 type List interface {
    181 	// Len reports the number of entries in the List.
    182 	// Get, Set, and Truncate panic with out of bound indexes.
    183 	Len() int
    184 
    185 	// Get retrieves the value at the given index.
    186 	// It never returns an invalid value.
    187 	Get(int) Value
    188 
    189 	// Set stores a value for the given index.
    190 	// When setting a composite type, it is unspecified whether the set
    191 	// value aliases the source's memory in any way.
    192 	//
    193 	// Set is a mutating operation and unsafe for concurrent use.
    194 	Set(int, Value)
    195 
    196 	// Append appends the provided value to the end of the list.
    197 	// When appending a composite type, it is unspecified whether the appended
    198 	// value aliases the source's memory in any way.
    199 	//
    200 	// Append is a mutating operation and unsafe for concurrent use.
    201 	Append(Value)
    202 
    203 	// AppendMutable appends a new, empty, mutable message value to the end
    204 	// of the list and returns it.
    205 	// It panics if the list does not contain a message type.
    206 	AppendMutable() Value
    207 
    208 	// Truncate truncates the list to a smaller length.
    209 	//
    210 	// Truncate is a mutating operation and unsafe for concurrent use.
    211 	Truncate(int)
    212 
    213 	// NewElement returns a new value for a list element.
    214 	// For enums, this returns the first enum value.
    215 	// For other scalars, this returns the zero value.
    216 	// For messages, this returns a new, empty, mutable value.
    217 	NewElement() Value
    218 
    219 	// IsValid reports whether the list is valid.
    220 	//
    221 	// An invalid list is an empty, read-only value.
    222 	//
    223 	// Validity is not part of the protobuf data model, and may not
    224 	// be preserved in marshaling or other operations.
    225 	IsValid() bool
    226 }
    227 
    228 // Map is an unordered, associative map.
    229 // The entry MapKey type is determined by FieldDescriptor.MapKey.Kind.
    230 // The entry Value type is determined by FieldDescriptor.MapValue.Kind.
    231 // Providing a MapKey or Value that is invalid or of an incorrect type panics.
    232 type Map interface {
    233 	// Len reports the number of elements in the map.
    234 	Len() int
    235 
    236 	// Range iterates over every map entry in an undefined order,
    237 	// calling f for each key and value encountered.
    238 	// Range calls f Len times unless f returns false, which stops iteration.
    239 	// While iterating, mutating operations may only be performed
    240 	// on the current map key.
    241 	Range(f func(MapKey, Value) bool)
    242 
    243 	// Has reports whether an entry with the given key is in the map.
    244 	Has(MapKey) bool
    245 
    246 	// Clear clears the entry associated with they given key.
    247 	// The operation does nothing if there is no entry associated with the key.
    248 	//
    249 	// Clear is a mutating operation and unsafe for concurrent use.
    250 	Clear(MapKey)
    251 
    252 	// Get retrieves the value for an entry with the given key.
    253 	// It returns an invalid value for non-existent entries.
    254 	Get(MapKey) Value
    255 
    256 	// Set stores the value for an entry with the given key.
    257 	// It panics when given a key or value that is invalid or the wrong type.
    258 	// When setting a composite type, it is unspecified whether the set
    259 	// value aliases the source's memory in any way.
    260 	//
    261 	// Set is a mutating operation and unsafe for concurrent use.
    262 	Set(MapKey, Value)
    263 
    264 	// Mutable retrieves a mutable reference to the entry for the given key.
    265 	// If no entry exists for the key, it creates a new, empty, mutable value
    266 	// and stores it as the entry for the key.
    267 	// It panics if the map value is not a message.
    268 	Mutable(MapKey) Value
    269 
    270 	// NewValue returns a new value assignable as a map value.
    271 	// For enums, this returns the first enum value.
    272 	// For other scalars, this returns the zero value.
    273 	// For messages, this returns a new, empty, mutable value.
    274 	NewValue() Value
    275 
    276 	// IsValid reports whether the map is valid.
    277 	//
    278 	// An invalid map is an empty, read-only value.
    279 	//
    280 	// An invalid message often corresponds to a nil Go map value,
    281 	// but the details are implementation dependent.
    282 	// Validity is not part of the protobuf data model, and may not
    283 	// be preserved in marshaling or other operations.
    284 	IsValid() bool
    285 }