module ValidateMyRoutes::Validate::ConvertToType

ConvertToType module provides single method convert_to_type to convert value into type to_type. Conversion can fail with InvalidTypeError.

Constants

BOOLEAN_TYPES
Boolean
COMPOSITE_TYPES
SIMPLE_TYPES

Public Class Methods

convert_to_type(value, to_type) click to toggle source
# File lib/validate_my_routes/validate/convert_to_type.rb, line 14
def convert_to_type(value, to_type)
  return value if already_of_type?(value, to_type)

  if SIMPLE_TYPES.include?(to_type)
    parse_simple_type(value, to_type)
  elsif COMPOSITE_TYPES.include?(to_type)
    parse_composite_type(value, to_type)
  elsif BOOLEAN_TYPES.include?(to_type)
    parse_boolean(value)
  else
    raise_unknown_type(to_type)
  end
rescue ArgumentError
  raise_with_invalid_type(value, to_type)
end

Private Class Methods

already_of_type?(value, typ) click to toggle source
# File lib/validate_my_routes/validate/convert_to_type.rb, line 32
def already_of_type?(value, typ)
  (typ.is_a?(Class) || typ.is_a?(Module)) && value.is_a?(typ)
end
parse_boolean(value) click to toggle source
# File lib/validate_my_routes/validate/convert_to_type.rb, line 58
def parse_boolean(value)
  if value.to_s.casecmp('false').zero?
    false
  elsif value.to_s.casecmp('true').zero?
    true
  else
    raise_with_invalid_type(value, Boolean)
  end
end
parse_composite_type(value, to_type) click to toggle source
# File lib/validate_my_routes/validate/convert_to_type.rb, line 48
def parse_composite_type(value, to_type)
  if to_type == Array
    value.split(',')
  elsif to_type == Hash
    Hash[value.split(',').map { |item| item.split(':') }]
  else
    raise_unknown_type(to_type)
  end
end
parse_simple_type(value, to_type) click to toggle source
# File lib/validate_my_routes/validate/convert_to_type.rb, line 36
def parse_simple_type(value, to_type)
  if to_type == Integer
    Integer(value)
  elsif [Float, String].include?(to_type)
    Kernel.send(to_type.to_s.to_sym, value)
  elsif to_type.respond_to? :parse
    to_type.parse(value)
  else
    raise_unknown_type(to_type)
  end
end
raise_unknown_type(type) click to toggle source
# File lib/validate_my_routes/validate/convert_to_type.rb, line 73
def raise_unknown_type(type)
  raise ValidateMyRoutes::Errors::InvalidTypeError,
        "don't know how to convert type '#{type}'"
end
raise_with_invalid_type(value, type) click to toggle source
# File lib/validate_my_routes/validate/convert_to_type.rb, line 68
def raise_with_invalid_type(value, type)
  raise ValidateMyRoutes::Errors::InvalidTypeError,
        "'#{value}' is not a valid '#{type}'"
end