protobuf-cucumber 3.10.4
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.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.rubocop.yml +70 -0
- data/.rubocop_todo.yml +145 -0
- data/.travis.yml +40 -0
- data/.yardopts +5 -0
- data/CHANGES.md +344 -0
- data/CONTRIBUTING.md +16 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +33 -0
- data/Rakefile +64 -0
- data/bin/protoc-gen-ruby +22 -0
- data/bin/rpc_server +5 -0
- data/install-protobuf.sh +28 -0
- data/lib/protobuf.rb +129 -0
- data/lib/protobuf/cli.rb +257 -0
- data/lib/protobuf/code_generator.rb +120 -0
- data/lib/protobuf/decoder.rb +28 -0
- data/lib/protobuf/deprecation.rb +117 -0
- data/lib/protobuf/descriptors.rb +3 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +62 -0
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +301 -0
- data/lib/protobuf/encoder.rb +11 -0
- data/lib/protobuf/enum.rb +365 -0
- data/lib/protobuf/exceptions.rb +9 -0
- data/lib/protobuf/field.rb +74 -0
- data/lib/protobuf/field/base_field.rb +380 -0
- data/lib/protobuf/field/base_field_object_definitions.rb +504 -0
- data/lib/protobuf/field/bool_field.rb +64 -0
- data/lib/protobuf/field/bytes_field.rb +78 -0
- data/lib/protobuf/field/double_field.rb +25 -0
- data/lib/protobuf/field/enum_field.rb +61 -0
- data/lib/protobuf/field/field_array.rb +104 -0
- data/lib/protobuf/field/field_hash.rb +122 -0
- data/lib/protobuf/field/fixed32_field.rb +25 -0
- data/lib/protobuf/field/fixed64_field.rb +28 -0
- data/lib/protobuf/field/float_field.rb +43 -0
- data/lib/protobuf/field/int32_field.rb +21 -0
- data/lib/protobuf/field/int64_field.rb +34 -0
- data/lib/protobuf/field/integer_field.rb +23 -0
- data/lib/protobuf/field/message_field.rb +51 -0
- data/lib/protobuf/field/sfixed32_field.rb +27 -0
- data/lib/protobuf/field/sfixed64_field.rb +28 -0
- data/lib/protobuf/field/signed_integer_field.rb +29 -0
- data/lib/protobuf/field/sint32_field.rb +21 -0
- data/lib/protobuf/field/sint64_field.rb +21 -0
- data/lib/protobuf/field/string_field.rb +51 -0
- data/lib/protobuf/field/uint32_field.rb +21 -0
- data/lib/protobuf/field/uint64_field.rb +21 -0
- data/lib/protobuf/field/varint_field.rb +77 -0
- data/lib/protobuf/generators/base.rb +85 -0
- data/lib/protobuf/generators/enum_generator.rb +39 -0
- data/lib/protobuf/generators/extension_generator.rb +27 -0
- data/lib/protobuf/generators/field_generator.rb +193 -0
- data/lib/protobuf/generators/file_generator.rb +262 -0
- data/lib/protobuf/generators/group_generator.rb +122 -0
- data/lib/protobuf/generators/message_generator.rb +104 -0
- data/lib/protobuf/generators/option_generator.rb +17 -0
- data/lib/protobuf/generators/printable.rb +160 -0
- data/lib/protobuf/generators/service_generator.rb +50 -0
- data/lib/protobuf/lifecycle.rb +33 -0
- data/lib/protobuf/logging.rb +39 -0
- data/lib/protobuf/message.rb +260 -0
- data/lib/protobuf/message/fields.rb +233 -0
- data/lib/protobuf/message/serialization.rb +85 -0
- data/lib/protobuf/optionable.rb +70 -0
- data/lib/protobuf/rpc/buffer.rb +78 -0
- data/lib/protobuf/rpc/client.rb +140 -0
- data/lib/protobuf/rpc/connectors/base.rb +221 -0
- data/lib/protobuf/rpc/connectors/ping.rb +89 -0
- data/lib/protobuf/rpc/connectors/socket.rb +78 -0
- data/lib/protobuf/rpc/connectors/zmq.rb +319 -0
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +50 -0
- data/lib/protobuf/rpc/env.rb +60 -0
- data/lib/protobuf/rpc/error.rb +28 -0
- data/lib/protobuf/rpc/error/client_error.rb +31 -0
- data/lib/protobuf/rpc/error/server_error.rb +43 -0
- data/lib/protobuf/rpc/middleware.rb +25 -0
- data/lib/protobuf/rpc/middleware/exception_handler.rb +40 -0
- data/lib/protobuf/rpc/middleware/logger.rb +95 -0
- data/lib/protobuf/rpc/middleware/request_decoder.rb +79 -0
- data/lib/protobuf/rpc/middleware/response_encoder.rb +83 -0
- data/lib/protobuf/rpc/middleware/runner.rb +18 -0
- data/lib/protobuf/rpc/rpc.pb.rb +64 -0
- data/lib/protobuf/rpc/rpc_method.rb +16 -0
- data/lib/protobuf/rpc/server.rb +39 -0
- data/lib/protobuf/rpc/servers/socket/server.rb +121 -0
- data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
- data/lib/protobuf/rpc/servers/socket_runner.rb +46 -0
- data/lib/protobuf/rpc/servers/zmq/broker.rb +194 -0
- data/lib/protobuf/rpc/servers/zmq/server.rb +321 -0
- data/lib/protobuf/rpc/servers/zmq/util.rb +48 -0
- data/lib/protobuf/rpc/servers/zmq/worker.rb +105 -0
- data/lib/protobuf/rpc/servers/zmq_runner.rb +70 -0
- data/lib/protobuf/rpc/service.rb +172 -0
- data/lib/protobuf/rpc/service_directory.rb +261 -0
- data/lib/protobuf/rpc/service_dispatcher.rb +45 -0
- data/lib/protobuf/rpc/service_filters.rb +250 -0
- data/lib/protobuf/rpc/stat.rb +119 -0
- data/lib/protobuf/socket.rb +21 -0
- data/lib/protobuf/tasks.rb +1 -0
- data/lib/protobuf/tasks/compile.rake +80 -0
- data/lib/protobuf/varint.rb +20 -0
- data/lib/protobuf/varint_pure.rb +31 -0
- data/lib/protobuf/version.rb +3 -0
- data/lib/protobuf/wire_type.rb +10 -0
- data/lib/protobuf/zmq.rb +21 -0
- data/profile.html +5103 -0
- data/proto/dynamic_discovery.proto +44 -0
- data/proto/google/protobuf/compiler/plugin.proto +147 -0
- data/proto/google/protobuf/descriptor.proto +779 -0
- data/proto/rpc.proto +69 -0
- data/protobuf-cucumber.gemspec +57 -0
- data/spec/benchmark/tasks.rb +143 -0
- data/spec/bin/protoc-gen-ruby_spec.rb +23 -0
- data/spec/encoding/all_types_spec.rb +103 -0
- data/spec/encoding/extreme_values_spec.rb +0 -0
- data/spec/functional/class_inheritance_spec.rb +52 -0
- data/spec/functional/code_generator_spec.rb +58 -0
- data/spec/functional/socket_server_spec.rb +59 -0
- data/spec/functional/zmq_server_spec.rb +105 -0
- data/spec/lib/protobuf/cli_spec.rb +317 -0
- data/spec/lib/protobuf/code_generator_spec.rb +87 -0
- data/spec/lib/protobuf/enum_spec.rb +307 -0
- data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
- data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/enum_field_spec.rb +44 -0
- data/spec/lib/protobuf/field/field_array_spec.rb +105 -0
- data/spec/lib/protobuf/field/field_hash_spec.rb +168 -0
- data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
- data/spec/lib/protobuf/field/int32_field_spec.rb +120 -0
- data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
- data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/string_field_spec.rb +79 -0
- data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field_spec.rb +192 -0
- data/spec/lib/protobuf/generators/base_spec.rb +154 -0
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +82 -0
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +42 -0
- data/spec/lib/protobuf/generators/field_generator_spec.rb +197 -0
- data/spec/lib/protobuf/generators/file_generator_spec.rb +119 -0
- data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
- data/spec/lib/protobuf/generators/service_generator_spec.rb +99 -0
- data/spec/lib/protobuf/lifecycle_spec.rb +94 -0
- data/spec/lib/protobuf/message_spec.rb +944 -0
- data/spec/lib/protobuf/optionable_spec.rb +265 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +66 -0
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +226 -0
- data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +34 -0
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +110 -0
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +91 -0
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +38 -0
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +43 -0
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +55 -0
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +35 -0
- data/spec/lib/protobuf/rpc/service_directory_spec.rb +293 -0
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +35 -0
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +517 -0
- data/spec/lib/protobuf/rpc/service_spec.rb +162 -0
- data/spec/lib/protobuf/rpc/stat_spec.rb +101 -0
- data/spec/lib/protobuf/varint_spec.rb +29 -0
- data/spec/lib/protobuf_spec.rb +105 -0
- data/spec/spec_helper.rb +42 -0
- data/spec/support/all.rb +6 -0
- data/spec/support/packed_field.rb +23 -0
- data/spec/support/protos/all_types.data.bin +0 -0
- data/spec/support/protos/all_types.data.txt +119 -0
- data/spec/support/protos/enum.pb.rb +63 -0
- data/spec/support/protos/enum.proto +37 -0
- data/spec/support/protos/extreme_values.data.bin +0 -0
- data/spec/support/protos/google_unittest.bin +0 -0
- data/spec/support/protos/google_unittest.pb.rb +798 -0
- data/spec/support/protos/google_unittest.proto +884 -0
- data/spec/support/protos/google_unittest_custom_options.bin +0 -0
- data/spec/support/protos/google_unittest_custom_options.pb.rb +361 -0
- data/spec/support/protos/google_unittest_custom_options.proto +424 -0
- data/spec/support/protos/google_unittest_import.pb.rb +55 -0
- data/spec/support/protos/google_unittest_import.proto +73 -0
- data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
- data/spec/support/protos/google_unittest_import_public.proto +41 -0
- data/spec/support/protos/map-test.bin +157 -0
- data/spec/support/protos/map-test.pb.rb +85 -0
- data/spec/support/protos/map-test.proto +68 -0
- data/spec/support/protos/multi_field_extensions.pb.rb +59 -0
- data/spec/support/protos/multi_field_extensions.proto +35 -0
- data/spec/support/protos/resource.pb.rb +172 -0
- data/spec/support/protos/resource.proto +137 -0
- data/spec/support/resource_service.rb +23 -0
- data/spec/support/server.rb +65 -0
- data/spec/support/test_app_file.rb +2 -0
- data/varint_prof.rb +82 -0
- metadata +579 -0
@@ -0,0 +1,380 @@
|
|
1
|
+
require 'active_support/core_ext/hash/slice'
|
2
|
+
require 'protobuf/field/field_array'
|
3
|
+
require 'protobuf/field/field_hash'
|
4
|
+
require 'protobuf/field/base_field_object_definitions'
|
5
|
+
|
6
|
+
module Protobuf
|
7
|
+
module Field
|
8
|
+
class BaseField
|
9
|
+
include ::Protobuf::Logging
|
10
|
+
::Protobuf::Optionable.inject(self, false) { ::Google::Protobuf::FieldOptions }
|
11
|
+
|
12
|
+
##
|
13
|
+
# Constants
|
14
|
+
#
|
15
|
+
OBJECT_MODULE = ::Protobuf::Field::BaseFieldObjectDefinitions
|
16
|
+
PACKED_TYPES = [
|
17
|
+
::Protobuf::WireType::VARINT,
|
18
|
+
::Protobuf::WireType::FIXED32,
|
19
|
+
::Protobuf::WireType::FIXED64,
|
20
|
+
].freeze
|
21
|
+
|
22
|
+
##
|
23
|
+
# Attributes
|
24
|
+
#
|
25
|
+
attr_reader :default_value, :message_class, :name, :fully_qualified_name, :options, :rule, :tag, :type_class
|
26
|
+
|
27
|
+
##
|
28
|
+
# Class Methods
|
29
|
+
#
|
30
|
+
|
31
|
+
def self.default
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
|
35
|
+
##
|
36
|
+
# Constructor
|
37
|
+
#
|
38
|
+
|
39
|
+
def initialize(message_class, rule, type_class, fully_qualified_name, tag, simple_name, options)
|
40
|
+
@message_class = message_class
|
41
|
+
@name = simple_name || fully_qualified_name
|
42
|
+
@fully_qualified_name = fully_qualified_name
|
43
|
+
@rule = rule
|
44
|
+
@tag = tag
|
45
|
+
@type_class = type_class
|
46
|
+
# Populate the option hash with all the original default field options, for backwards compatibility.
|
47
|
+
# However, both default and custom options should ideally be accessed through the Optionable .{get,get!}_option functions.
|
48
|
+
@options = options.slice(:ctype, :packed, :deprecated, :lazy, :jstype, :weak, :uninterpreted_option, :default, :extension)
|
49
|
+
options.each do |option_name, value|
|
50
|
+
set_option(option_name, value)
|
51
|
+
end
|
52
|
+
|
53
|
+
@extension = options.key?(:extension)
|
54
|
+
@deprecated = options.key?(:deprecated)
|
55
|
+
@required = rule == :required
|
56
|
+
@repeated = rule == :repeated
|
57
|
+
@optional = rule == :optional
|
58
|
+
@packed = @repeated && options.key?(:packed)
|
59
|
+
|
60
|
+
validate_packed_field if packed?
|
61
|
+
define_accessor(simple_name, fully_qualified_name) if simple_name
|
62
|
+
set_repeated_message!
|
63
|
+
set_map!
|
64
|
+
@value_from_values = nil
|
65
|
+
@value_from_values_for_serialization = nil
|
66
|
+
@field_predicate = nil
|
67
|
+
@field_and_present_predicate = nil
|
68
|
+
@set_field = nil
|
69
|
+
@set_method = nil
|
70
|
+
@to_message_hash = nil
|
71
|
+
@to_message_hash_string_keys = nil
|
72
|
+
@encode_to_stream = nil
|
73
|
+
|
74
|
+
define_value_from_values!
|
75
|
+
define_value_from_values_for_serialization!
|
76
|
+
define_field_predicate!
|
77
|
+
define_field_and_present_predicate!
|
78
|
+
define_set_field!
|
79
|
+
define_set_method!
|
80
|
+
define_to_message_hash!
|
81
|
+
define_encode_to_stream!
|
82
|
+
set_default_value!
|
83
|
+
end
|
84
|
+
|
85
|
+
##
|
86
|
+
# Public Instance Methods
|
87
|
+
#
|
88
|
+
|
89
|
+
def acceptable?(_value)
|
90
|
+
true
|
91
|
+
end
|
92
|
+
|
93
|
+
def coerce!(value)
|
94
|
+
value
|
95
|
+
end
|
96
|
+
|
97
|
+
def decode(_bytes)
|
98
|
+
fail NotImplementedError, "#{self.class.name}##{__method__}"
|
99
|
+
end
|
100
|
+
|
101
|
+
def default
|
102
|
+
options[:default]
|
103
|
+
end
|
104
|
+
|
105
|
+
def set_default_value!
|
106
|
+
@default_value ||= if optional? || required?
|
107
|
+
typed_default_value
|
108
|
+
elsif map?
|
109
|
+
::Protobuf::Field::FieldHash.new(self).freeze
|
110
|
+
elsif repeated?
|
111
|
+
::Protobuf::Field::FieldArray.new(self).freeze
|
112
|
+
else
|
113
|
+
fail "Unknown field label -- something went very wrong"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def define_encode_to_stream!
|
118
|
+
@encode_to_stream = if repeated? && packed?
|
119
|
+
OBJECT_MODULE::RepeatedPackedEncodeToStream.new(self)
|
120
|
+
elsif repeated?
|
121
|
+
OBJECT_MODULE::RepeatedNotPackedEncodeToStream.new(self)
|
122
|
+
elsif message? || type_class == ::Protobuf::Field::BytesField
|
123
|
+
OBJECT_MODULE::BytesEncodeToStream.new(self)
|
124
|
+
elsif type_class == ::Protobuf::Field::StringField
|
125
|
+
OBJECT_MODULE::StringEncodeToStream.new(self)
|
126
|
+
else
|
127
|
+
OBJECT_MODULE::BaseEncodeToStream.new(self)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def encode_to_stream(value, stream)
|
132
|
+
@encode_to_stream.call(value, stream)
|
133
|
+
end
|
134
|
+
|
135
|
+
def define_field_predicate!
|
136
|
+
@field_predicate = if repeated?
|
137
|
+
OBJECT_MODULE::RepeatedFieldPredicate.new(self)
|
138
|
+
else
|
139
|
+
OBJECT_MODULE::BaseFieldPredicate.new(self)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def field?(values)
|
144
|
+
@field_predicate.call(values)
|
145
|
+
end
|
146
|
+
|
147
|
+
def define_field_and_present_predicate!
|
148
|
+
@field_and_present_predicate = if !repeated? && type_class == ::Protobuf::Field::BoolField # boolean present check
|
149
|
+
OBJECT_MODULE::BoolFieldAndPresentPredicate.new(self)
|
150
|
+
else
|
151
|
+
OBJECT_MODULE::BaseFieldAndPresentPredicate.new(self)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def field_and_present?(values)
|
156
|
+
@field_and_present_predicate.call(values)
|
157
|
+
end
|
158
|
+
|
159
|
+
def define_value_from_values!
|
160
|
+
@value_from_values = if map?
|
161
|
+
OBJECT_MODULE::MapValueFromValues.new(self)
|
162
|
+
elsif repeated?
|
163
|
+
OBJECT_MODULE::RepeatedFieldValueFromValues.new(self)
|
164
|
+
elsif type_class == ::Protobuf::Field::BoolField # boolean present check
|
165
|
+
OBJECT_MODULE::BoolFieldValueFromValues.new(self)
|
166
|
+
else
|
167
|
+
OBJECT_MODULE::BaseFieldValueFromValues.new(self)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def value_from_values(values)
|
172
|
+
@value_from_values.call(values)
|
173
|
+
end
|
174
|
+
|
175
|
+
def define_value_from_values_for_serialization!
|
176
|
+
@value_from_values_for_serialization = if map?
|
177
|
+
OBJECT_MODULE::MapValueFromValuesForSerialization.new(self)
|
178
|
+
elsif repeated?
|
179
|
+
OBJECT_MODULE::RepeatedFieldValueFromValuesForSerialization.new(self)
|
180
|
+
elsif type_class == ::Protobuf::Field::BoolField # boolean present check
|
181
|
+
OBJECT_MODULE::BoolFieldValueFromValuesForSerialization.new(self)
|
182
|
+
else
|
183
|
+
OBJECT_MODULE::BaseFieldValueFromValuesForSerialization.new(self)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def value_from_values_for_serialization(values)
|
188
|
+
@value_from_values_for_serialization.call(values)
|
189
|
+
end
|
190
|
+
|
191
|
+
def define_set_field!
|
192
|
+
@set_field = if map? && required?
|
193
|
+
OBJECT_MODULE::RequiredMapSetField.new(self)
|
194
|
+
elsif repeated? && required?
|
195
|
+
OBJECT_MODULE::RequiredRepeatedSetField.new(self)
|
196
|
+
elsif type_class == ::Protobuf::Field::StringField && required?
|
197
|
+
OBJECT_MODULE::RequiredStringSetField.new(self)
|
198
|
+
elsif required?
|
199
|
+
OBJECT_MODULE::RequiredBaseSetField.new(self)
|
200
|
+
elsif map?
|
201
|
+
OBJECT_MODULE::MapSetField.new(self)
|
202
|
+
elsif repeated?
|
203
|
+
OBJECT_MODULE::RepeatedSetField.new(self)
|
204
|
+
elsif type_class == ::Protobuf::Field::StringField
|
205
|
+
OBJECT_MODULE::StringSetField.new(self)
|
206
|
+
else
|
207
|
+
OBJECT_MODULE::BaseSetField.new(self)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def set_field(values, value, ignore_nil_for_repeated, message_instance)
|
212
|
+
@set_field.call(values, value, ignore_nil_for_repeated, message_instance)
|
213
|
+
end
|
214
|
+
|
215
|
+
def define_to_message_hash!
|
216
|
+
if message? || enum? || repeated? || map?
|
217
|
+
@to_message_hash = OBJECT_MODULE::ToHashValueToMessageHash.new(self)
|
218
|
+
@to_message_hash_string_keys = OBJECT_MODULE::ToHashValueToMessageHashWithStringKey.new(self)
|
219
|
+
else
|
220
|
+
@to_message_hash = OBJECT_MODULE::BaseToMessageHash.new(self)
|
221
|
+
@to_message_hash_string_keys = OBJECT_MODULE::BaseToMessageHashWithStringKey.new(self)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def to_message_hash(values, result)
|
226
|
+
@to_message_hash.call(values, result)
|
227
|
+
end
|
228
|
+
|
229
|
+
def to_message_hash_with_string_key(values, result)
|
230
|
+
@to_message_hash_string_keys.call(values, result)
|
231
|
+
end
|
232
|
+
|
233
|
+
def deprecated?
|
234
|
+
@deprecated
|
235
|
+
end
|
236
|
+
|
237
|
+
def encode(_value)
|
238
|
+
fail NotImplementedError, "#{self.class.name}##{__method__}"
|
239
|
+
end
|
240
|
+
|
241
|
+
def extension?
|
242
|
+
@extension
|
243
|
+
end
|
244
|
+
|
245
|
+
def enum?
|
246
|
+
false
|
247
|
+
end
|
248
|
+
|
249
|
+
def message?
|
250
|
+
false
|
251
|
+
end
|
252
|
+
|
253
|
+
def set_map!
|
254
|
+
set_repeated_message!
|
255
|
+
@is_map = repeated_message? && type_class.get_option!(:map_entry)
|
256
|
+
end
|
257
|
+
|
258
|
+
def map?
|
259
|
+
@is_map
|
260
|
+
end
|
261
|
+
|
262
|
+
def optional?
|
263
|
+
@optional
|
264
|
+
end
|
265
|
+
|
266
|
+
def packed?
|
267
|
+
@packed
|
268
|
+
end
|
269
|
+
|
270
|
+
def repeated?
|
271
|
+
@repeated
|
272
|
+
end
|
273
|
+
|
274
|
+
def set_repeated_message!
|
275
|
+
@repeated_message = repeated? && message?
|
276
|
+
end
|
277
|
+
|
278
|
+
def repeated_message?
|
279
|
+
@repeated_message
|
280
|
+
end
|
281
|
+
|
282
|
+
def required?
|
283
|
+
@required
|
284
|
+
end
|
285
|
+
|
286
|
+
def define_set_method!
|
287
|
+
@set_method = if map?
|
288
|
+
OBJECT_MODULE::MapSetMethod.new(self)
|
289
|
+
elsif repeated? && packed?
|
290
|
+
OBJECT_MODULE::RepeatedPackedSetMethod.new(self)
|
291
|
+
elsif repeated?
|
292
|
+
OBJECT_MODULE::RepeatedNotPackedSetMethod.new(self)
|
293
|
+
else
|
294
|
+
OBJECT_MODULE::BaseSetMethod.new(self)
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
def set(message_instance, bytes)
|
299
|
+
@set_method.call(message_instance, bytes)
|
300
|
+
end
|
301
|
+
|
302
|
+
def tag_encoded
|
303
|
+
@tag_encoded ||= begin
|
304
|
+
case
|
305
|
+
when repeated? && packed?
|
306
|
+
::Protobuf::Field::VarintField.encode((tag << 3) | ::Protobuf::WireType::LENGTH_DELIMITED)
|
307
|
+
else
|
308
|
+
::Protobuf::Field::VarintField.encode((tag << 3) | wire_type)
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
# FIXME: add packed, deprecated, extension options to to_s output
|
314
|
+
def to_s
|
315
|
+
"#{rule} #{type_class} #{name} = #{tag} #{default ? "[default=#{default.inspect}]" : ''}"
|
316
|
+
end
|
317
|
+
|
318
|
+
::Protobuf.deprecator.define_deprecated_methods(self, :type => :type_class)
|
319
|
+
|
320
|
+
def wire_type
|
321
|
+
::Protobuf::WireType::VARINT
|
322
|
+
end
|
323
|
+
|
324
|
+
def fully_qualified_name_only!
|
325
|
+
@name = @fully_qualified_name
|
326
|
+
|
327
|
+
##
|
328
|
+
# Recreate all of the meta methods as they may have used the original `name` value
|
329
|
+
#
|
330
|
+
define_value_from_values!
|
331
|
+
define_value_from_values_for_serialization!
|
332
|
+
define_field_predicate!
|
333
|
+
define_field_and_present_predicate!
|
334
|
+
define_set_field!
|
335
|
+
define_set_method!
|
336
|
+
define_to_message_hash!
|
337
|
+
define_encode_to_stream!
|
338
|
+
end
|
339
|
+
|
340
|
+
private
|
341
|
+
|
342
|
+
##
|
343
|
+
# Private Instance Methods
|
344
|
+
#
|
345
|
+
|
346
|
+
def define_accessor(simple_field_name, fully_qualified_field_name)
|
347
|
+
message_class.class_eval do
|
348
|
+
define_method("#{simple_field_name}!") do
|
349
|
+
@values[fully_qualified_field_name] if field?(fully_qualified_field_name)
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
message_class.class_eval do
|
354
|
+
define_method(simple_field_name) { self[fully_qualified_field_name] }
|
355
|
+
define_method("#{simple_field_name}=") { |v| set_field(fully_qualified_field_name, v, false) }
|
356
|
+
end
|
357
|
+
|
358
|
+
return unless deprecated?
|
359
|
+
|
360
|
+
::Protobuf.field_deprecator.deprecate_method(message_class, simple_field_name)
|
361
|
+
::Protobuf.field_deprecator.deprecate_method(message_class, "#{simple_field_name}!")
|
362
|
+
::Protobuf.field_deprecator.deprecate_method(message_class, "#{simple_field_name}=")
|
363
|
+
end
|
364
|
+
|
365
|
+
def typed_default_value
|
366
|
+
if default.nil?
|
367
|
+
self.class.default
|
368
|
+
else
|
369
|
+
default
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
def validate_packed_field
|
374
|
+
if packed? && ! ::Protobuf::Field::BaseField::PACKED_TYPES.include?(wire_type)
|
375
|
+
fail "Can't use packed encoding for '#{type_class}' type"
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
end
|
380
|
+
end
|
@@ -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
|