class Xpect::Keys

Public Class Methods

new(required: {}, optional: {}) click to toggle source
# File lib/xpect/keys.rb, line 3
def initialize(required: {}, optional: {})
  raise "required must be a Hash" unless required.is_a?(Hash) && optional.is_a?(Hash)

  @optional = optional
  @required = required
end

Public Instance Methods

conform!(value:, path: []) click to toggle source
# File lib/xpect/keys.rb, line 10
def conform!(value:, path: [])
  required = process_required(value, path)
  process_optional(required, value, path)
end

Private Instance Methods

process_optional(init, value, path) click to toggle source
# File lib/xpect/keys.rb, line 17
def process_optional(init, value, path)
  @optional.reduce(init) do |memo, (key, val)|
    if val.is_a?(Keys)
      memo[key] = val.conform!(value: value[key], path: path)
    else
      if value.has_key?(key)
        data_value = value.fetch(key)
        memo[key] = Xpect::Type.process(val, val, data_value, path)
      end
    end

    memo
  end
end
process_required(value, path) click to toggle source
# File lib/xpect/keys.rb, line 32
def process_required(value, path)
  @required.reduce({}) do |memo, (key, val)|
    if val.is_a?(Keys)
      memo[key] = val.conform!(value: value[key], path: path)
    else
      if value.has_key?(key)
        data_value = value.fetch(key)
        memo[key] = Xpect::Type.process(val, val, data_value, path)
      else
        if val.is_a?(Pred) && val.default
          memo[key] = val.default
        else
          raise FailedSpec, "does not include '#{ key }' at '#{ path }'"
        end
      end
    end

    memo
  end
end