class Definition::Types::Each::Conformer

Attributes

definition[RW]

Public Class Methods

new(definition) click to toggle source
# File lib/definition/types/each.rb, line 20
def initialize(definition)
  self.definition = definition
end

Public Instance Methods

conform(value) click to toggle source
# File lib/definition/types/each.rb, line 24
def conform(value)
  return non_array_error(value) unless value.is_a?(Array)

  results = conform_all(value)

  if results.all?(&:conformed?)
    ConformResult.new(results.map(&:value))
  else
    ConformResult.new(value, errors: [ConformError.new(definition,
                                                       "Not all items conform with '#{definition.name}'",
                                                       sub_errors: errors(results))])
  end
end

Private Instance Methods

conform_all(values) click to toggle source
# File lib/definition/types/each.rb, line 57
def conform_all(values)
  values.map do |value|
    definition.item_definition.conform(value)
  end
end
errors(results) click to toggle source
# File lib/definition/types/each.rb, line 42
def errors(results)
  errors = []
  results.each_with_index do |result, index|
    next if result.passed?

    errors << KeyConformError.new(
      definition,
      "Item #{result.value.inspect} did not conform to #{definition.name}",
      key:        index,
      sub_errors: result.error_tree
    )
  end
  errors
end
non_array_error(value) click to toggle source
# File lib/definition/types/each.rb, line 63
def non_array_error(value)
  ConformResult.new(value, errors: [
                      ConformError.new(definition,
                                       "Non-Array value does not conform with #{definition.name}")
                    ])
end