class Pakyow::Verifier

Public Class Methods

formatted_message(message, type:, key:) click to toggle source
# File lib/pakyow/verifier.rb, line 67
def formatted_message(message, type:, key:)
  case type
  when :full
    "#{key} #{message}"
  when :presentable
    "#{Support.inflector.humanize(key)} #{message}"
  else
    message
  end
end
new(key = nil, &block) click to toggle source
# File lib/pakyow/verifier.rb, line 84
def initialize(key = nil, &block)
  @key = key
  @types = {}
  @messages = {}
  @required_keys = []
  @optional_keys = []
  @allowable_keys = []
  @verifiers_by_key = {}
  @validator = Validator.new(key)

  if block
    instance_eval(&block)
  end
end

Public Instance Methods

call(values, context: nil) click to toggle source
# File lib/pakyow/verifier.rb, line 128
def call(values, context: nil)
  values ||= {}

  if should_sanitize?(values)
    values = sanitize(values)
  end

  result = Result.new

  if should_validate?(values)
    result.validation(@validator.call(values, context: context))
  end

  @allowable_keys.each do |allowable_key|
    if values[allowable_key].nil?
      if @required_keys.include?(allowable_key)
        result.error(allowable_key, @messages[allowable_key])
      else
        next
      end
    end

    if verifier_for_key = @verifiers_by_key[allowable_key]
      Array.ensure(values[allowable_key]).each do |values_for_key|
        result.nested(allowable_key, verifier_for_key.call(values_for_key, context: context))
      end
    end
  end

  result
end
optional(key, type = nil, &block) click to toggle source
# File lib/pakyow/verifier.rb, line 114
def optional(key, type = nil, &block)
  key = key.to_sym
  @optional_keys.push(key).uniq!
  @allowable_keys.push(key).uniq!

  if type
    @types[key] = Types.type_for(type)
  end

  if block
    @verifiers_by_key[key] = self.class.new(key, &block)
  end
end
required(key, type = nil, message: "is required", &block) click to toggle source
# File lib/pakyow/verifier.rb, line 99
def required(key, type = nil, message: "is required", &block)
  key = key.to_sym
  @required_keys.push(key).uniq!
  @allowable_keys.push(key).uniq!
  @messages[key] = message

  if type
    @types[key] = Types.type_for(type)
  end

  if block
    @verifiers_by_key[key] = self.class.new(key, &block)
  end
end

Private Instance Methods

sanitize(values) click to toggle source
# File lib/pakyow/verifier.rb, line 162
def sanitize(values)
  values.select! do |key, _|
    @allowable_keys.include?(key.to_sym)
  end

  @allowable_keys.each do |key|
    key = key.to_sym

    if values.key?(key)
      value = values[key]

      if type = @types[key]
        value = type[value]
      end

      values[key] = value
    end
  end

  values
end
should_sanitize?(values) click to toggle source
# File lib/pakyow/verifier.rb, line 184
def should_sanitize?(values)
  values.is_a?(Pakyow::Support::IndifferentHash) || values.is_a?(Hash) || values.is_a?(Connection::Params)
end
should_validate?(values) click to toggle source
# File lib/pakyow/verifier.rb, line 188
def should_validate?(values)
  @validator.any? && !values.nil?
end