Module: Anyway::AutoCast

Defined in:
lib/anyway/auto_cast.rb

Constant Summary collapse

ARRAY_RXP =

Regexp to detect array values Array value is a values that contains at least one comma and doesn’t start/end with quote

/\A[^'"].*\s*,\s*.*[^'"]\z/

Class Method Summary collapse

Class Method Details

.call(val) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/anyway/auto_cast.rb', line 11

def call(val)
  return val unless val.is_a?(::Hash) || val.is_a?(::String)

  case val
  when Hash
    val.transform_values { call(_1) }
  when ARRAY_RXP
    val.split(/\s*,\s*/).map { call(_1) }
  when /\A(true|t|yes|y)\z/i
    true
  when /\A(false|f|no|n)\z/i
    false
  when /\A(nil|null)\z/i
    nil
  when /\A\d+\z/
    val.to_i
  when /\A\d*\.\d+\z/
    val.to_f
  when /\A['"].*['"]\z/
    val.gsub(/(\A['"]|['"]\z)/, "")
  else
    val
  end
end

.cast_hash(obj) ⇒ Object



36
37
38
39
40
# File 'lib/anyway/auto_cast.rb', line 36

def cast_hash(obj)
  obj.transform_values do |val|
    val.is_a?(::Hash) ? cast_hash(val) : call(val)
  end
end

.coerce(_key, val) ⇒ Object



42
43
44
# File 'lib/anyway/auto_cast.rb', line 42

def coerce(_key, val)
  call(val)
end