11require 'active_support/core_ext/hash/slice'
22require 'protobuf/field/field_array'
33require 'protobuf/field/field_hash'
4- require 'protobuf/field/base_field_method_definitions '
4+ require 'protobuf/field/base_field_object_definitions '
55
66module Protobuf
77 module Field
@@ -12,7 +12,7 @@ class BaseField
1212 ##
1313 # Constants
1414 #
15-
15+ OBJECT_MODULE = :: Protobuf :: Field :: BaseFieldObjectDefinitions
1616 PACKED_TYPES = [
1717 ::Protobuf ::WireType ::VARINT ,
1818 ::Protobuf ::WireType ::FIXED32 ,
@@ -61,9 +61,20 @@ def initialize(message_class, rule, type_class, fully_qualified_name, tag, simpl
6161 define_accessor ( simple_name , fully_qualified_name ) if simple_name
6262 set_repeated_message!
6363 set_map!
64- define_hash_accessor_for_message!
65- define_field_p!
66- define_field_and_present_p!
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!
6778 define_set_field!
6879 define_set_method!
6980 define_to_message_hash!
@@ -104,69 +115,121 @@ def set_default_value!
104115 end
105116
106117 def define_encode_to_stream!
107- if repeated? && packed?
108- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_repeated_packed_encode_to_stream_method! ( self )
109- elsif repeated?
110- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_repeated_not_packed_encode_to_stream_method! ( self )
111- elsif message? || type_class == ::Protobuf ::Field ::BytesField
112- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_bytes_encode_to_stream_method! ( self )
113- elsif type_class == ::Protobuf ::Field ::StringField
114- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_string_encode_to_stream_method! ( self )
115- else
116- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_base_encode_to_stream_method! ( self )
117- end
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
118141 end
119142
120- def define_field_p!
121- if repeated?
122- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_repeated_field_p! ( self )
123- else
124- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_base_field_p! ( self )
125- end
143+ def field? ( values )
144+ @field_predicate . call ( values )
126145 end
127146
128- def define_field_and_present_p !
129- if type_class == ::Protobuf ::Field ::BoolField # boolean present check
130- :: Protobuf :: Field :: BaseFieldMethodDefinitions . define_bool_field_and_present_p! ( self )
131- else
132- :: Protobuf :: Field :: BaseFieldMethodDefinitions . define_base_field_and_present_p! ( self )
133- end
147+ def define_field_and_present_predicate !
148+ @field_and_present_predicate = if type_class == ::Protobuf ::Field ::BoolField # boolean present check
149+ OBJECT_MODULE :: BoolFieldAndPresentPredicate . new ( self )
150+ else
151+ OBJECT_MODULE :: BaseFieldAndPresentPredicate . new ( self )
152+ end
134153 end
135154
136- def define_hash_accessor_for_message!
137- if map?
138- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_map_value_from_values! ( self )
139- elsif repeated?
140- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_repeated_value_from_values! ( self )
141- elsif type_class == ::Protobuf ::Field ::BoolField # boolean present check
142- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_bool_field_value_from_values! ( self )
143- else
144- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_field_value_from_values! ( self )
145- end
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 )
146189 end
147190
148191 def define_set_field!
149- if map?
150- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_map_set_field! ( self )
151- elsif repeated?
152- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_repeated_set_field! ( self )
153- elsif type_class == ::Protobuf ::Field ::StringField
154- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_string_set_field! ( self )
155- else
156- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_base_set_field! ( self )
157- end
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 )
158213 end
159214
160215 def define_to_message_hash!
161216 if message? || enum? || repeated? || map?
162- :: Protobuf :: Field :: BaseFieldMethodDefinitions . define_to_hash_value_to_message_hash! ( self )
163- :: Protobuf :: Field :: BaseFieldMethodDefinitions . define_to_hash_value_to_message_hash_with_string_key! ( self )
217+ @to_message_hash = OBJECT_MODULE :: ToHashValueToMessageHash . new ( self )
218+ @to_message_hash_string_keys = OBJECT_MODULE :: ToHashValueToMessageHashWithStringKey . new ( self )
164219 else
165- :: Protobuf :: Field :: BaseFieldMethodDefinitions . define_base_to_message_hash! ( self )
166- :: Protobuf :: Field :: BaseFieldMethodDefinitions . define_base_to_message_hash_with_string_key! ( self )
220+ @to_message_hash = OBJECT_MODULE :: BaseToMessageHash . new ( self )
221+ @to_message_hash_string_keys = OBJECT_MODULE :: BaseToMessageHashWithStringKey . new ( self )
167222 end
168223 end
169224
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+
170233 def deprecated?
171234 @deprecated
172235 end
@@ -221,15 +284,19 @@ def required?
221284 end
222285
223286 def define_set_method!
224- if map?
225- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_map_set_method! ( self )
226- elsif repeated? && packed?
227- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_repeated_packed_set_method! ( self )
228- elsif repeated?
229- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_repeated_not_packed_set_method! ( self )
230- else
231- ::Protobuf ::Field ::BaseFieldMethodDefinitions . define_base_set_method! ( self )
232- end
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 )
233300 end
234301
235302 def tag_encoded
@@ -260,9 +327,10 @@ def fully_qualified_name_only!
260327 ##
261328 # Recreate all of the meta methods as they may have used the original `name` value
262329 #
263- define_hash_accessor_for_message!
264- define_field_p!
265- define_field_and_present_p!
330+ define_value_from_values!
331+ define_value_from_values_for_serialization!
332+ define_field_predicate!
333+ define_field_and_present_predicate!
266334 define_set_field!
267335 define_set_method!
268336 define_to_message_hash!
0 commit comments