Class: T::Types::FixedHash

Inherits:
Base
  • Object
show all
Defined in:
lib/types/types/fixed_hash.rb

Overview

Takes a hash of types. Validates each item in a hash using the type in the same position in the list.

Instance Method Summary collapse

Methods inherited from Base

#==, #error_message_for_obj, #error_message_for_obj_recursive, #hash, method_added, #subtype_of?, #to_s, #validate!

Constructor Details

#initialize(types) ⇒ FixedHash

Returns a new instance of FixedHash.



8
9
10
# File 'lib/types/types/fixed_hash.rb', line 8

def initialize(types)
  @inner_types = types
end

Instance Method Details

#build_typeObject



16
17
18
19
# File 'lib/types/types/fixed_hash.rb', line 16

def build_type
  types
  nil
end

#describe_obj(obj) ⇒ Object

This gives us better errors, e.g.: ‘Expected String, got TrueClass` instead of `Expected String, got Hash`.

overrides Base



81
82
83
84
85
86
87
# File 'lib/types/types/fixed_hash.rb', line 81

def describe_obj(obj)
  if obj.is_a?(Hash)
    "type #{serialize_hash(obj.transform_values(&:class))}"
  else
    super
  end
end

#nameObject

overrides Base



22
23
24
# File 'lib/types/types/fixed_hash.rb', line 22

def name
  serialize_hash(types)
end

#recursively_valid?(obj) ⇒ Boolean

overrides Base

Returns:



27
28
29
30
31
32
# File 'lib/types/types/fixed_hash.rb', line 27

def recursively_valid?(obj)
  return false unless obj.is_a?(Hash)
  return false if types.any? {|key, type| !type.recursively_valid?(obj[key])}
  return false if obj.any? {|key, _| !types[key]}
  true
end

#typesObject



12
13
14
# File 'lib/types/types/fixed_hash.rb', line 12

def types
  @types ||= @inner_types.transform_values {|v| T::Utils.coerce(v)}
end

#valid?(obj) ⇒ Boolean

overrides Base

Returns:



35
36
37
38
39
40
# File 'lib/types/types/fixed_hash.rb', line 35

def valid?(obj)
  return false unless obj.is_a?(Hash)
  return false if types.any? {|key, type| !type.valid?(obj[key])}
  return false if obj.any? {|key, _| !types[key]}
  true
end