Skip to content

Commit faaaca2

Browse files
committed
remove all meta programming
1 parent b3a1f14 commit faaaca2

5 files changed

Lines changed: 3682 additions & 4102 deletions

File tree

lib/protobuf/field/base_field.rb

Lines changed: 131 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
require 'active_support/core_ext/hash/slice'
22
require 'protobuf/field/field_array'
33
require 'protobuf/field/field_hash'
4-
require 'protobuf/field/base_field_method_definitions'
4+
require 'protobuf/field/base_field_object_definitions'
55

66
module 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

Comments
 (0)