Class: Runger::TypeRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/runger/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/runger/type_casting.rb', line 12

def initialize
  @registry = {}
end

Class Method Details

.defaultObject



7
8
9
# File 'lib/runger/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
23
# File 'lib/runger/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



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/runger/type_casting.rb', line 25

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
      unless type_id.respond_to?(:call)
        raise(ArgumentError,
          "Type must implement #call(val): #{type_id}")
      end

      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

#dupObject



48
49
50
51
52
# File 'lib/runger/type_casting.rb', line 48

def dup
  new_obj = self.class.allocate
  new_obj.instance_variable_set(:@registry, registry.dup)
  new_obj
end