module Grumlin::Typing

Constants

CASTABLE_TYPES
TYPES

Public Class Methods

cast(value) click to toggle source
# File lib/grumlin/typing.rb, line 22
def cast(value)
  verify_type!(value)

  return value unless value.is_a?(Hash)

  type = TYPES[value[:@type]]

  verify_castable_hash!(value, type)

  type.call(value[:@value])
end

Private Class Methods

cast_double(value) click to toggle source
# File lib/grumlin/typing.rb, line 52
def cast_double(value)
  raise TypeError, "#{value} is not a Double" unless value.is_a?(Float)

  value
end
cast_entity(entity, value) click to toggle source
# File lib/grumlin/typing.rb, line 58
def cast_entity(entity, value)
  entity.new(**value)
rescue ArgumentError, TypeError
  raise TypeError, "#{value} cannot be casted to #{entity.name}"
end
cast_int(value) click to toggle source
# File lib/grumlin/typing.rb, line 46
def cast_int(value)
  raise TypeError, "#{value} is not an Integer" unless value.is_a?(Integer)

  value
end
cast_map(value) click to toggle source
# File lib/grumlin/typing.rb, line 64
def cast_map(value)
  Hash[*value].transform_keys do |key|
    next key.to_sym if key.respond_to?(:to_sym)
    next cast(key) if key[:@type]

    raise UnknownMapKey, key, value
  end.transform_values { |v| cast(v) }
rescue ArgumentError
  raise TypeError, "#{value} cannot be casted to Hash"
end
verify_castable_hash!(value, type) click to toggle source
# File lib/grumlin/typing.rb, line 40
def verify_castable_hash!(value, type)
  raise TypeError, "#{value} cannot be casted, @type is missing" if value[:@type].nil?
  raise(UnknownTypeError, value[:@type]) if type.nil?
  raise TypeError, "#{value} cannot be casted, @value is missing" if value[:@value].nil?
end
verify_type!(value) click to toggle source
# File lib/grumlin/typing.rb, line 36
def verify_type!(value)
  raise TypeError, "#{value.inspect} cannot be casted" unless CASTABLE_TYPES.include?(value.class)
end