{
String => ->(v) { v.to_s },
Integer => ->(v) { Integer(v) },
Float => ->(v) { Float(v) },
Boolean => ->(v) {
case v.to_s.downcase
when "true", "1", "yes" then true
when "false", "0", "no", "nil" then false
else raise ArgumentError
end
},
Date => ->(v) { Date.parse(v) },
Time => ->(v) { Time.parse(v) },
DateTime => ->(v) { DateTime.parse(v) },
Array => ->(v) {
return v if v.is_a?(Array)
JSON.parse(v)
},
Hash => ->(v) {
return v if v.is_a?(Hash)
JSON.parse(v)
},
UUID => ->(v) {
uuid = v.to_s
raise ArgumentError unless uuid.match?(/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/i)
uuid
},
Decimal => ->(v) { BigDecimal(v.to_s) },
Symbol => ->(v) { v.to_sym }
}.freeze