lib/protobuf/field/message_field.rb in protobuf-3.6.12 vs lib/protobuf/field/message_field.rb in protobuf-3.7.0.pre0
- old
+ new
@@ -7,11 +7,11 @@
##
# Public Instance Methods
#
def acceptable?(val)
- val.is_a?(type_class) || val.respond_to?(:to_hash)
+ val.is_a?(type_class) || val.respond_to?(:to_hash) || val.respond_to?(:to_proto)
end
def decode(bytes)
type_class.decode(bytes)
end
@@ -28,33 +28,23 @@
def wire_type
::Protobuf::WireType::LENGTH_DELIMITED
end
- private
+ def coerce!(value)
+ return nil if value.nil?
- ##
- # Private Instance Methods
- #
+ coerced_value = if value.respond_to?(:to_proto)
+ value.to_proto
+ elsif value.respond_to?(:to_hash)
+ type_class.new(value.to_hash)
+ else
+ value
+ end
- def define_setter
- field = self
- message_class.class_eval do
- define_method("#{field.name}=") do |val|
- case
- when val.nil?
- @values.delete(field.name)
- when val.is_a?(field.type_class)
- @values[field.name] = val
- when val.respond_to?(:to_proto)
- @values[field.name] = val.to_proto
- when val.respond_to?(:to_hash)
- @values[field.name] = field.type_class.new(val.to_hash)
- else
- fail TypeError, "Expected value of type '#{field.type_class}' for field #{field.name}, but got '#{val.class}'"
- end
- end
- end
+ return coerced_value if coerced_value.is_a?(type_class)
+
+ fail TypeError, "Expected value of type '#{type_class}' for field #{name}, but got '#{value.class}'"
end
end
end
end