/
converter_registry.rb
64 lines (58 loc) · 1.4 KB
/
converter_registry.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# frozen_string_literal: true
module TTY
class Prompt
# Immutable collection of converters for type transformation
#
# @api private
class ConverterRegistry
# Create a registry of conversions
#
# @param [Hash] registry
#
# @api private
def initialize(registry = {})
@_registry = registry.dup.freeze
freeze
end
# Register converter
#
# @param [Symbol] name
# the converter name
#
# @api public
def register(name, contents = nil, &block)
item = block_given? ? block : contents
if key?(name)
raise ArgumentError,
"Converter for #{name.inspect} already registered"
end
self.class.new(@_registry.merge(name => item))
end
# Check if converter is registered
#
# @return [Boolean]
#
# @api public
def key?(key)
@_registry.key?(key)
end
# Execute converter
#
# @api public
def call(name, input)
if name.respond_to?(:call)
converter = name
else
converter = @_registry.fetch(name) do
raise ArgumentError, "#{name.inspect} is not registered"
end
end
converter[input]
end
alias [] call
def inspect
@_registry.inspect
end
end # ConverterRegistry
end # Prompt
end # TTY