Class: Anyway::TypeRegistry
- Inherits:
-
Object
- Object
- Anyway::TypeRegistry
- Defined in:
- lib/anyway/type_casting.rb
Overview
Contains a mapping between type IDs/names and deserializers
Class Method Summary collapse
Instance Method Summary collapse
- #accept(name_or_object, &block) ⇒ Object
- #deserialize(raw, type_id, array: false) ⇒ Object
- #dup ⇒ Object
-
#initialize ⇒ TypeRegistry
constructor
A new instance of TypeRegistry.
Constructor Details
#initialize ⇒ TypeRegistry
Returns a new instance of TypeRegistry.
12 13 14 |
# File 'lib/anyway/type_casting.rb', line 12 def initialize @registry = {} end |
Class Method Details
.default ⇒ Object
7 8 9 |
# File 'lib/anyway/type_casting.rb', line 7 def default @default ||= TypeRegistry.new end |
Instance Method Details
#accept(name_or_object, &block) ⇒ Object
16 17 18 19 20 21 22 |
# File 'lib/anyway/type_casting.rb', line 16 def accept(name_or_object, &block) if !block && !name_or_object.respond_to?(:call) raise ArgumentError, "Please, provide a type casting block or an object implementing #call(val) method" end registry[name_or_object] = block || name_or_object end |
#deserialize(raw, type_id, array: false) ⇒ Object
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/anyway/type_casting.rb', line 24 def deserialize(raw, type_id, array: false) return if raw.nil? caster = if type_id.is_a?(Symbol) || type_id.nil? registry.fetch(type_id) { raise ArgumentError, "Unknown type: #{type_id}" } else raise ArgumentError, "Type must implement #call(val): #{type_id}" unless type_id.respond_to?(:call) type_id end if array raw_arr = raw.is_a?(String) ? raw.split(/\s*,\s*/) : Array(raw) raw_arr.map { caster.call(_1) } else caster.call(raw) end end |
#dup ⇒ Object
43 44 45 46 47 |
# File 'lib/anyway/type_casting.rb', line 43 def dup new_obj = self.class.allocate new_obj.instance_variable_set(:@registry, registry.dup) new_obj end |