class Datacaster::HashSchema

Public Class Methods

new(fields) click to toggle source
# File lib/datacaster/hash_schema.rb, line 3
def initialize(fields)
  @fields = fields
  # support of shortcut nested validation definitions, e.g. array_schema(a: [integer], b: {c: integer})
  @fields.transform_values! { |validator| shortcut_definition(validator) }
end

Public Instance Methods

call(object) click to toggle source
Calls superclass method Datacaster::Base#call
# File lib/datacaster/hash_schema.rb, line 9
def call(object)
  object = super(object)

  return Datacaster.ErrorResult(["must be hash"]) unless object.value.is_a?(Hash)

  checked_schema = object.meta[:checked_schema].dup || {}

  errors = {}
  result = {}

  @fields.each do |key, validator|
    value =
      if object.value.key?(key)
        object.value[key]
      else
        Datacaster.absent
      end

    new_value = validator.(value)
    if new_value.valid?
      result[key] = new_value.value
      checked_schema[key] = new_value.meta[:checked_schema].dup || true
    else
      errors[key] = new_value.errors
    end
  end

  if errors.empty?
    # All unchecked key-value pairs are passed through, and eliminated by Terminator
    # at the end of the chain
    result_hash = object.value.merge(result)
    result_hash.keys.each { |k| result_hash.delete(k) if result_hash[k] == Datacaster.absent }
    Datacaster.ValidResult(result_hash, meta: {checked_schema: checked_schema})
  else
    Datacaster.ErrorResult(errors)
  end
end
inspect() click to toggle source
# File lib/datacaster/hash_schema.rb, line 47
def inspect
  field_descriptions =
    @fields.map do |k, v|
      "#{k.inspect} => #{v.inspect}"
    end

  "#<Datacaster::HashSchema {#{field_descriptions.join(', ')}}>"
end