Class: Anyway::TypeRegistry

Inherits:
Object
  • Object
show all
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

Constructor Details

#initializeTypeRegistry

Returns a new instance of TypeRegistry.



12
13
14
# File 'lib/anyway/type_casting.rb', line 12

def initialize
  @registry = {}
end

Class Method Details

.defaultObject



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(it) }
  else
    caster.call(raw)
  end
end

#dupObject



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