lib/virtus/attribute/embedded_value.rb in virtus-1.0.0.beta6 vs lib/virtus/attribute/embedded_value.rb in virtus-1.0.0.beta7
- old
+ new
@@ -23,56 +23,70 @@
# :street => 'Street 1/2', :zipcode => '12345', :city => 'NYC' })
#
class EmbeddedValue < Attribute
TYPES = [Struct, OpenStruct, Virtus, Model::Constructor].freeze
- class FromStruct < self
+ class Coercer
+ attr_reader :primitive
+ def initialize(primitive)
+ @primitive = primitive
+ end
+
+ end # Coercer
+
+ class FromStruct < Coercer
+
# @api public
- def coerce(input)
+ def call(input)
if input.kind_of?(primitive)
input
elsif not input.nil?
primitive.new(*input)
end
end
+
end # FromStruct
- class FromOpenStruct < self
+ class FromOpenStruct < Coercer
# @api public
- def coerce(input)
+ def call(input)
if input.kind_of?(primitive)
input
elsif not input.nil?
primitive.new(input)
end
end
+
end # FromOpenStruct
# @api private
def self.handles?(klass)
klass.is_a?(Class) && TYPES.any? { |type| klass <= type }
end
# @api private
- def self.determine_type(klass)
- if klass < Virtus || klass < Model::Constructor || klass <= OpenStruct
- FromOpenStruct
- elsif klass < Struct
- FromStruct
- end
+ def self.build_type(options)
+ Axiom::Types::Object.new { primitive options[:type] }
end
# @api private
- def self.build_type(options)
- Axiom::Types::Object.new { primitive options[:type] }
+ def self.build_coercer(type, _options)
+ primitive = type.primitive
+
+ if primitive < Virtus || primitive < Model::Constructor || primitive <= OpenStruct
+ FromOpenStruct.new(primitive)
+ elsif primitive < Struct
+ FromStruct.new(primitive)
+ end
end
# @api public
def primitive
type.primitive
end
end # class EmbeddedValue
+
end # class Attribute
end # module Virtus