class TinyTyping::Tester

Public Class Methods

expect(types, value) click to toggle source
# File lib/tinytyping.rb, line 47
def expect(types, value)
  return if expect_any(types, value)

  raise ArgumentError, "#{value.inspect} isn't #{(Array.try_convert(types) || [types]).map(&:inspect).join(' or ')}."
end
expect_any(types, value) click to toggle source
# File lib/tinytyping.rb, line 43
def expect_any(types, value)
  (Array.try_convert(types) || [types]).any? { |type| expect_shape(type, value) }
end
expect_shape(type, value) click to toggle source
# File lib/tinytyping.rb, line 6
def expect_shape(type, value)
  case type
  when Class
    value.is_a?(type)
  when true, false, nil
    value == type
  when Array
    return false unless value.is_a?(Array)

    value.each { |val| expect(type, val) }
    true
  when Hash
    return false unless value.is_a?(Hash)

    class_key_types = []
    named_key_types = []
    type.each_key do |key|
      case key
      when Class, Array
        class_key_types << key
      else
        named_key_types << key
      end
    end
    (value.keys + named_key_types).uniq.each do |key|
      expect(class_key_types.flatten(1), key) unless type.include?(key)
      ktypes = []
      ktypes << key if named_key_types.include?(key)
      ktypes.push(*class_key_types.select { |t| expect_any(t, key) }) if value.include?(key)
      expect(ktypes.flat_map { |k| type[k] }, value[key])
    end
    true
  else
    raise TypeError, "no implicit conversion of #{type.class} into Class"
  end
end
new(*types) click to toggle source
# File lib/tinytyping.rb, line 54
def initialize(*types)
  @types = types
end

Public Instance Methods

run!(value) click to toggle source
# File lib/tinytyping.rb, line 58
def run!(value)
  self.class.expect(@types, value)
  nil
end