Module: RSchema::CoercionMapper

Defined in:
lib/rschema.rb

Class Method Summary collapse

Class Method Details

.coerce_hash(schema, value) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/rschema.rb', line 119

def self.coerce_hash(schema, value)
  symbol_keys = Set.new(schema.keys.select{ |k| k.is_a?(Symbol) }.map(&:to_s))
  value.reduce({}) do |accum, (k, v)|
    # convert string keys to symbol keys, if needed
    if k.is_a?(String) && symbol_keys.include?(k)
      k = k.to_sym
    end

    # strip out keys that don't exist in the schema
    if schema.has_key?(k)
      accum[k] = v
    end

    accum
  end
end

.postwalk(schema, value) ⇒ Object



109
110
111
# File 'lib/rschema.rb', line 109

def self.postwalk(schema, value)
  value
end

.prewalk(schema, value) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/rschema.rb', line 87

def self.prewalk(schema, value)
  if schema == Integer && value.is_a?(String)
    try_convert(value) { Integer(value) }
  elsif schema == Float && value.is_a?(String)
    try_convert(value) { Float(value) }
  elsif schema == Float && value.is_a?(Integer)
    value.to_f
  elsif schema == Symbol && value.is_a?(String)
    value.to_sym
  elsif schema == String && value.is_a?(Symbol)
    value.to_s
  elsif schema == Array && value.is_a?(Set)
    value.to_a
  elsif (schema == Set || schema.is_a?(GenericSetSchema)) && value.is_a?(Array)
    Set.new(value)
  elsif(schema.is_a?(Hash) && value.is_a?(Hash))
    coerce_hash(schema, value)
  else
    value
  end
end

.try_convert(x) ⇒ Object



113
114
115
116
117
# File 'lib/rschema.rb', line 113

def self.try_convert(x)
  yield x
rescue
  x
end