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