class HashSchema::OrSchema

Public Class Methods

new(*schemas) click to toggle source
# File lib/hash_schema.rb, line 84
def initialize(*schemas)
  @chain = schemas
end

Public Instance Methods

expectation() click to toggle source
# File lib/hash_schema.rb, line 104
def expectation
  *names, name = chain.map(&:expectation)
  names.join(', ') << " or #{name}"
end
validate(data) click to toggle source
# File lib/hash_schema.rb, line 88
def validate(data)
  empty_error = true
  last_error = nil
  chain.each do |schema|
    next unless schema_matches_data_type(schema, data)
    last_error = schema.validate(data)
    empty_error = recursive_empty_error?(last_error)
    break if empty_error
  end
  if empty_error
    last_error
  else
    error(data)
  end
end

Private Instance Methods

recursive_empty_error?(error) click to toggle source
# File lib/hash_schema.rb, line 111
def recursive_empty_error?(error)
  case error
  when NilClass
    true
  when String
    false
  when Hash, Array
    recursive_flat_error_values(error).empty?
  else
    false
  end
end
recursive_flat_error_values(error_object) click to toggle source
# File lib/hash_schema.rb, line 135
def recursive_flat_error_values(error_object)
  if error_object.is_a? Hash
    error_object.values.flat_map do |value|
      recursive_flat_error_values(value)
    end.compact
  elsif error_object.is_a? Array
    error_object.flat_map do |value|
      recursive_flat_error_values(value)
    end.compact
  else
    error_object
  end
end
schema_matches_data_type(schema, data) click to toggle source
# File lib/hash_schema.rb, line 124
def schema_matches_data_type(schema, data)
  case schema
  when ArraySchema
    data.is_a? Array
  when HashSchema
    data.is_a? Hash
  else
    true
  end
end