class HashSchema::HashSchema

Public Class Methods

new(strict: false, schema_hash: {}, **keywords) click to toggle source
# File lib/hash_schema.rb, line 199
def initialize(strict: false, schema_hash: {}, **keywords)
  @chain = schema_hash.merge(keywords)
  @strict = strict
end

Public Instance Methods

unexpected(key) click to toggle source
# File lib/hash_schema.rb, line 220
def unexpected(key)
  "Unexpected key: #{key.to_s.inspect}"
end
validate(hash) click to toggle source
# File lib/hash_schema.rb, line 204
def validate(hash)
  return error(hash) unless hash.is_a?(Hash)
  {}.tap do |output|
    chain.each do |key, schema|
      val = hash.fetch(key, hash.fetch(key.to_s, Void.new))
      output[key] = if schema.kind_of?(Schema)
        schema.validate(val)
      else
        schema == val ? nil : expect(schema.inspect, val)
      end
    end

    output.merge!((hash.keys - chain.keys).map { |k| [k, unexpected(k)] }.to_h) if @strict
  end
end