protobuf 3.8.5 → 3.9.0.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,504 @@
1
+ module Protobuf
2
+ module Field
3
+ module BaseFieldObjectDefinitions
4
+
5
+ class ToHashValueToMessageHashWithStringKey
6
+ def initialize(selph)
7
+ @selph = selph
8
+ @name = selph.name.to_s
9
+ end
10
+
11
+ def call(values, result)
12
+ result[@name] = @selph.value_from_values(values).to_hash_value
13
+ end
14
+ end
15
+
16
+ class BaseToMessageHashWithStringKey
17
+ def initialize(selph)
18
+ @selph = selph
19
+ @name = selph.name.to_s
20
+ end
21
+
22
+ def call(values, result)
23
+ result[@name] = @selph.value_from_values(values)
24
+ end
25
+ end
26
+
27
+ class ToHashValueToMessageHash
28
+ def initialize(selph)
29
+ @selph = selph
30
+ @name = selph.name.to_sym
31
+ end
32
+
33
+ def call(values, result)
34
+ result[@name] = @selph.value_from_values(values).to_hash_value
35
+ end
36
+ end
37
+
38
+ class BaseToMessageHash
39
+ def initialize(selph)
40
+ @selph = selph
41
+ @name = selph.name.to_sym
42
+ end
43
+
44
+ def call(values, result)
45
+ result[@name] = @selph.value_from_values(values)
46
+ end
47
+ end
48
+
49
+ class RepeatedPackedEncodeToStream
50
+ def initialize(selph)
51
+ @selph = selph
52
+ @tag_encoded = selph.tag_encoded
53
+ end
54
+
55
+ def call(value, stream)
56
+ packed_value = value.map { |val| @selph.encode(val) }.join
57
+ stream << @tag_encoded << "#{::Protobuf::Field::VarintField.encode(packed_value.size)}#{packed_value}"
58
+ end
59
+ end
60
+
61
+ class BytesEncodeToStream
62
+ def initialize(selph)
63
+ @selph = selph
64
+ @tag_encoded = selph.tag_encoded
65
+ end
66
+
67
+ def call(value, stream)
68
+ value = value.encode if value.is_a?(::Protobuf::Message)
69
+ byte_size = ::Protobuf::Field::VarintField.encode(value.bytesize)
70
+
71
+ stream << @tag_encoded << byte_size << value
72
+ end
73
+ end
74
+
75
+ class StringEncodeToStream
76
+ def initialize(selph)
77
+ @selph = selph
78
+ @tag_encoded = selph.tag_encoded
79
+ end
80
+
81
+ def call(value, stream)
82
+ new_value = "" + value
83
+ if new_value.encoding != ::Protobuf::Field::StringField::ENCODING
84
+ new_value.encode!(::Protobuf::Field::StringField::ENCODING, :invalid => :replace, :undef => :replace, :replace => "")
85
+ end
86
+
87
+ stream << @tag_encoded << ::Protobuf::Field::VarintField.encode(new_value.bytesize) << new_value
88
+ end
89
+ end
90
+
91
+ class BaseEncodeToStream
92
+ def initialize(selph)
93
+ @selph = selph
94
+ @tag_encoded = selph.tag_encoded
95
+ end
96
+
97
+ def call(value, stream)
98
+ stream << @tag_encoded << @selph.encode(value)
99
+ end
100
+ end
101
+
102
+ class RepeatedNotPackedEncodeToStream
103
+ def initialize(selph)
104
+ @selph = selph
105
+ @tag_encoded = selph.tag_encoded
106
+ end
107
+
108
+ def call(value, stream)
109
+ value.each do |val|
110
+ stream << @tag_encoded << @selph.encode(val)
111
+ end
112
+ end
113
+ end
114
+
115
+ class BaseSetMethod
116
+ def initialize(selph)
117
+ @selph = selph
118
+ @name = selph.name
119
+ end
120
+
121
+ def call(message_instance, bytes)
122
+ message_instance.set_field(@name, @selph.decode(bytes), true, @selph)
123
+ end
124
+ end
125
+
126
+ class MapSetMethod
127
+ def initialize(selph)
128
+ @selph = selph
129
+ @name = selph.name
130
+ end
131
+
132
+ def call(message_instance, bytes)
133
+ hash = message_instance[@name]
134
+ entry = @selph.decode(bytes)
135
+ # decoded value could be nil for an
136
+ # enum value that is not recognized
137
+ hash[entry.key] = entry.value unless entry.value.nil?
138
+ hash[entry.key]
139
+ end
140
+ end
141
+
142
+ class RepeatedNotPackedSetMethod
143
+ def initialize(selph)
144
+ @selph = selph
145
+ @name = selph.name
146
+ end
147
+
148
+ def call(message_instance, bytes)
149
+ message_instance[@name] << @selph.decode(bytes)
150
+ end
151
+ end
152
+
153
+ class RepeatedPackedSetMethod
154
+ def initialize(selph)
155
+ @selph = selph
156
+ @name = selph.name
157
+ @wire_type = selph.wire_type
158
+ end
159
+
160
+ def call(message_instance, bytes)
161
+ array = message_instance[@name]
162
+ stream = ::StringIO.new(bytes)
163
+
164
+ if @wire_type == ::Protobuf::WireType::VARINT
165
+ array << @selph.decode(Varint.decode(stream)) until stream.eof?
166
+ elsif @wire_type == ::Protobuf::WireType::FIXED64
167
+ array << @selph.decode(stream.read(8)) until stream.eof?
168
+ elsif @wire_type == ::Protobuf::WireType::FIXED32
169
+ array << @selph.decode(stream.read(4)) until stream.eof?
170
+ end
171
+ end
172
+ end
173
+
174
+ class RequiredMapSetField
175
+ def initialize(selph)
176
+ @selph = selph
177
+ @tag = selph.tag
178
+ @fully_qualified_name = selph.fully_qualified_name
179
+ end
180
+
181
+ def call(values, value, _ignore_nil_for_repeated, message_instance)
182
+ unless value.is_a?(Hash)
183
+ fail TypeError, <<-TYPE_ERROR
184
+ Expected map value
185
+ Got '#{value.class}' for map protobuf field #{@selph.name}
186
+ TYPE_ERROR
187
+ end
188
+
189
+ if value.empty?
190
+ values.delete(@fully_qualified_name)
191
+ message_instance._protobuf_message_unset_required_field_tags << @tag
192
+ else
193
+ message_instance._protobuf_message_unset_required_field_tags.delete(@tag)
194
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldHash.new(@selph)
195
+ values[@fully_qualified_name].replace(value)
196
+ end
197
+ end
198
+ end
199
+
200
+ class MapSetField
201
+ def initialize(selph)
202
+ @selph = selph
203
+ @tag = selph.tag
204
+ @fully_qualified_name = selph.fully_qualified_name
205
+ end
206
+
207
+ def call(values, value, _ignore_nil_for_repeated, _message_instance)
208
+ unless value.is_a?(Hash)
209
+ fail TypeError, <<-TYPE_ERROR
210
+ Expected map value
211
+ Got '#{value.class}' for map protobuf field #{@selph.name}
212
+ TYPE_ERROR
213
+ end
214
+
215
+ if value.empty?
216
+ values.delete(@fully_qualified_name)
217
+ else
218
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldHash.new(@selph)
219
+ values[@fully_qualified_name].replace(value)
220
+ end
221
+ end
222
+ end
223
+
224
+ class RequiredRepeatedSetField
225
+ def initialize(selph)
226
+ @selph = selph
227
+ @tag = selph.tag
228
+ @fully_qualified_name = selph.fully_qualified_name
229
+ end
230
+
231
+ def call(values, value, ignore_nil_for_repeated, message_instance)
232
+ if value.nil? && ignore_nil_for_repeated
233
+ ::Protobuf.deprecator.deprecation_warning("['#{@fully_qualified_name}']=nil", "use an empty array instead of nil")
234
+ return
235
+ end
236
+
237
+ unless value.is_a?(Array)
238
+ fail TypeError, <<-TYPE_ERROR
239
+ Expected repeated value of type '#{@selph.type_class}'
240
+ Got '#{value.class}' for repeated protobuf field #{@selph.name}
241
+ TYPE_ERROR
242
+ end
243
+
244
+ value = value.compact
245
+
246
+ if value.empty?
247
+ values.delete(@fully_qualified_name)
248
+ message_instance._protobuf_message_unset_required_field_tags << @tag
249
+ else
250
+ message_instance._protobuf_message_unset_required_field_tags.delete(@tag)
251
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(@selph)
252
+ values[@fully_qualified_name].replace(value)
253
+ end
254
+ end
255
+ end
256
+
257
+ class RepeatedSetField
258
+ def initialize(selph)
259
+ @selph = selph
260
+ @tag = selph.tag
261
+ @fully_qualified_name = selph.fully_qualified_name
262
+ end
263
+
264
+ def call(values, value, ignore_nil_for_repeated, _message_instance)
265
+ if value.nil? && ignore_nil_for_repeated
266
+ ::Protobuf.deprecator.deprecation_warning("['#{@fully_qualified_name}']=nil", "use an empty array instead of nil")
267
+ return
268
+ end
269
+
270
+ unless value.is_a?(Array)
271
+ fail TypeError, <<-TYPE_ERROR
272
+ Expected repeated value of type '#{@selph.type_class}'
273
+ Got '#{value.class}' for repeated protobuf field #{@selph.name}
274
+ TYPE_ERROR
275
+ end
276
+
277
+ value = value.compact
278
+
279
+ if value.empty?
280
+ values.delete(@fully_qualified_name)
281
+ else
282
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(@selph)
283
+ values[@fully_qualified_name].replace(value)
284
+ end
285
+ end
286
+ end
287
+
288
+ class RequiredStringSetField
289
+ def initialize(selph)
290
+ @selph = selph
291
+ @tag = selph.tag
292
+ @fully_qualified_name = selph.fully_qualified_name
293
+ end
294
+
295
+ def call(values, value, _ignore_nil_for_repeated, message_instance)
296
+ if value
297
+ message_instance._protobuf_message_unset_required_field_tags.delete(@tag)
298
+ values[@fully_qualified_name] = if value.is_a?(String)
299
+ value
300
+ else
301
+ @selph.coerce!(value)
302
+ end
303
+ else
304
+ values.delete(@fully_qualified_name)
305
+ message_instance._protobuf_message_unset_required_field_tags << @tag
306
+ end
307
+ end
308
+ end
309
+
310
+ class StringSetField
311
+ def initialize(selph)
312
+ @selph = selph
313
+ @tag = selph.tag
314
+ @fully_qualified_name = selph.fully_qualified_name
315
+ end
316
+
317
+ def call(values, value, _ignore_nil_for_repeated, _message_instance)
318
+ if value
319
+ values[@fully_qualified_name] = if value.is_a?(String)
320
+ value
321
+ else
322
+ @selph.coerce!(value)
323
+ end
324
+ else
325
+ values.delete(@fully_qualified_name)
326
+ end
327
+ end
328
+ end
329
+
330
+ class RequiredBaseSetField
331
+ def initialize(selph)
332
+ @selph = selph
333
+ @tag = selph.tag
334
+ @fully_qualified_name = selph.fully_qualified_name
335
+ end
336
+
337
+ def call(values, value, _ignore_nil_for_repeated, message_instance)
338
+ if value.nil?
339
+ values.delete(@fully_qualified_name)
340
+ message_instance._protobuf_message_unset_required_field_tags << @tag
341
+ else
342
+ message_instance._protobuf_message_unset_required_field_tags.delete(@tag)
343
+ values[@fully_qualified_name] = @selph.coerce!(value)
344
+ end
345
+ end
346
+ end
347
+
348
+ class BaseSetField
349
+ def initialize(selph)
350
+ @selph = selph
351
+ @tag = selph.tag
352
+ @fully_qualified_name = selph.fully_qualified_name
353
+ end
354
+
355
+ def call(values, value, _ignore_nil_for_repeated, _message_instance)
356
+ if value.nil?
357
+ values.delete(@fully_qualified_name)
358
+ else
359
+ values[@fully_qualified_name] = @selph.coerce!(value)
360
+ end
361
+ end
362
+ end
363
+
364
+ class BaseFieldAndPresentPredicate
365
+ def initialize(selph)
366
+ @fully_qualified_name = selph.fully_qualified_name
367
+ end
368
+
369
+ def call(values)
370
+ values[@fully_qualified_name].present?
371
+ end
372
+ end
373
+
374
+ class BoolFieldAndPresentPredicate
375
+ BOOL_VALUES = [true, false].freeze
376
+
377
+ def initialize(selph)
378
+ @fully_qualified_name = selph.fully_qualified_name
379
+ end
380
+
381
+ def call(values)
382
+ BOOL_VALUES.include?(values[@fully_qualified_name])
383
+ end
384
+ end
385
+
386
+ class BaseFieldPredicate
387
+ def initialize(selph)
388
+ @fully_qualified_name = selph.fully_qualified_name
389
+ end
390
+
391
+ def call(values)
392
+ values.key?(@fully_qualified_name)
393
+ end
394
+ end
395
+
396
+ class RepeatedFieldPredicate
397
+ def initialize(selph)
398
+ @fully_qualified_name = selph.fully_qualified_name
399
+ end
400
+
401
+ def call(values)
402
+ values.key?(@fully_qualified_name) &&
403
+ values[@fully_qualified_name].present?
404
+ end
405
+ end
406
+
407
+ class BoolFieldValueFromValues
408
+ def initialize(selph)
409
+ @selph = selph
410
+ @fully_qualified_name = selph.fully_qualified_name
411
+ end
412
+
413
+ def call(values)
414
+ values.fetch(@fully_qualified_name) { @selph.default_value }
415
+ end
416
+ end
417
+
418
+ class BoolFieldValueFromValuesForSerialization
419
+ def initialize(selph)
420
+ @selph = selph
421
+ @fully_qualified_name = selph.fully_qualified_name
422
+ end
423
+
424
+ def call(values)
425
+ values.fetch(@fully_qualified_name) { @selph.default_value }
426
+ end
427
+ end
428
+
429
+ class BaseFieldValueFromValues
430
+ def initialize(selph)
431
+ @selph = selph
432
+ @fully_qualified_name = selph.fully_qualified_name
433
+ end
434
+
435
+ def call(values)
436
+ values[@fully_qualified_name] || @selph.default_value
437
+ end
438
+ end
439
+
440
+ class BaseFieldValueFromValuesForSerialization
441
+ def initialize(selph)
442
+ @selph = selph
443
+ @fully_qualified_name = selph.fully_qualified_name
444
+ end
445
+
446
+ def call(values)
447
+ values[@fully_qualified_name] || @selph.default_value
448
+ end
449
+ end
450
+
451
+ class MapValueFromValues
452
+ def initialize(selph)
453
+ @selph = selph
454
+ @fully_qualified_name = selph.fully_qualified_name
455
+ end
456
+
457
+ def call(values)
458
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldHash.new(@selph)
459
+ end
460
+ end
461
+
462
+ class MapValueFromValuesForSerialization
463
+ def initialize(selph)
464
+ @selph = selph
465
+ @fully_qualified_name = selph.fully_qualified_name
466
+ @type_class = selph.type_class
467
+ end
468
+
469
+ def call(values)
470
+ value = values[@fully_qualified_name] ||= ::Protobuf::Field::FieldHash.new(@selph)
471
+
472
+ array = []
473
+ value.each do |k, v|
474
+ array << @type_class.new(:key => k, :value => v)
475
+ end
476
+
477
+ array
478
+ end
479
+ end
480
+
481
+ class RepeatedFieldValueFromValues
482
+ def initialize(selph)
483
+ @selph = selph
484
+ @fully_qualified_name = selph.fully_qualified_name
485
+ end
486
+
487
+ def call(values)
488
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(@selph)
489
+ end
490
+ end
491
+
492
+ class RepeatedFieldValueFromValuesForSerialization
493
+ def initialize(selph)
494
+ @selph = selph
495
+ @fully_qualified_name = selph.fully_qualified_name
496
+ end
497
+
498
+ def call(values)
499
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(@selph)
500
+ end
501
+ end
502
+ end
503
+ end
504
+ end