go-bot

Форк
0
285 строк · 11.0 Кб
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
}
286

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.