Module: RubyAPI::ParamConverters

Defined in:
lib/rubyapi/param_converters.rb

Constant Summary collapse

CONVERTERS =
{
  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

Class Method Summary collapse

Class Method Details

.convert(value, type) ⇒ Object



49
50
51
52
53
54
55
56
# File 'lib/rubyapi/param_converters.rb', line 49

def self.convert(value, type)
  converter = CONVERTERS[type]
  return value.to_s unless converter
  converter.call(value)
rescue ArgumentError, TypeError, JSON::ParserError
  type_name = type.respond_to?(:name) ? type.name : type.to_s
  raise ConversionError.new(value.to_s, type_name)
end