class Definition::Types::Keys::Conformer

Attributes

definition[RW]
errors[RW]
value[RW]

Public Class Methods

new(definition, value) click to toggle source
# File lib/definition/types/keys.rb, line 80
def initialize(definition, value)
  self.definition = definition
  self.value = value
  self.errors = []
end

Public Instance Methods

conform() click to toggle source
# File lib/definition/types/keys.rb, line 86
def conform
  add_extra_key_errors unless definition.ignore_extra_keys
  add_missing_key_errors
  values = conform_all_keys

  ConformResult.new(values, errors: errors)
end

Private Instance Methods

add_extra_key_errors() click to toggle source
# File lib/definition/types/keys.rb, line 98
def add_extra_key_errors
  extra_keys = value.keys - all_keys
  return if extra_keys.empty?

  extra_keys.each do |key|
    errors.push(KeyConformError.new(
                  definition,
                  "#{definition.name} has extra key: #{key.inspect}",
                  key:      key,
                  i18n_key: "keys.has_extra_key"
                ))
  end
end
add_missing_key_errors() click to toggle source
# File lib/definition/types/keys.rb, line 154
def add_missing_key_errors
  required_definition = Types::Include.new(
    definition.name,
    *required_keys
  )

  result = required_definition.conform(value)
  return if result.passed?

  result.errors.each do |error|
    errors.push(missing_key_error(error.key))
  end
end
all_keys() click to toggle source
# File lib/definition/types/keys.rb, line 119
def all_keys
  required_keys + optional_keys
end
conform_all_keys() click to toggle source
# File lib/definition/types/keys.rb, line 112
def conform_all_keys
  required_keys_values = conform_definitions(required_definitions)
  optional_keys_values = conform_definitions(optional_definitions)

  definition.defaults.merge(required_keys_values.merge!(optional_keys_values))
end
conform_definitions(keys) click to toggle source
# File lib/definition/types/keys.rb, line 139
def conform_definitions(keys)
  keys.each_with_object({}) do |(key, key_definition), result_value|
    next unless value.key?(key)

    result = key_definition.conform(value[key])
    result_value[key] = result.value
    next if result.passed?

    errors.push(KeyConformError.new(key_definition,
                                    "#{definition.name} fails validation for key #{key}",
                                    key:        key,
                                    sub_errors: result.error_tree))
  end
end
missing_key_error(key) click to toggle source
# File lib/definition/types/keys.rb, line 168
def missing_key_error(key)
  KeyConformError.new(definition,
                      "#{definition.name} is missing key #{key.inspect}",
                      key:      key,
                      i18n_key: "keys.has_missing_key")
end
optional_definitions() click to toggle source
# File lib/definition/types/keys.rb, line 131
def optional_definitions
  definition.optional_definitions
end
optional_keys() click to toggle source
# File lib/definition/types/keys.rb, line 135
def optional_keys
  optional_definitions.keys
end
required_definitions() click to toggle source
# File lib/definition/types/keys.rb, line 123
def required_definitions
  definition.required_definitions
end
required_keys() click to toggle source
# File lib/definition/types/keys.rb, line 127
def required_keys
  required_definitions.keys
end