class Rack::App::Middlewares::Params::Validator

Constants

ValidateError

Public Class Methods

new(app, descriptor) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 4
def initialize(app, descriptor)
  @descriptor = descriptor
  @app = app
end

Public Instance Methods

call(env) click to toggle source

> 422 required field missing | “422 Unprocessable Entity”

# File lib/rack/app/middlewares/params/validator.rb, line 10
def call(env)
  validate(env)
  @app.call(env)
rescue ValidateError => ex
  unprocessable_response(ex)
end

Protected Instance Methods

error(message) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 81
def error(message)
  raise(ValidateError.new(message))
end
invalid_key_error(key) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 89
def invalid_key_error(key)
  error "invalid key: #{key}"
end
invalid_type_error(key, klass) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 93
def invalid_type_error(key, klass)
  error "invalid type for #{key}: #{klass} expected"
end
invalid_type_of_error(key, klass, of) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 97
def invalid_type_of_error(key, klass, of)
  error "invalid type for #{key}: #{klass} of #{of} expected"
end
missing_key_error(key, klass) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 85
def missing_key_error(key, klass)
  error "missing key: #{key}(#{klass})"
end
parse(type, str) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 77
def parse(type, str)
  ::Rack::App::Utils::Parser.parse(type, str)
end
unprocessable_response(validate_error) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 19
def unprocessable_response(validate_error)
  response = Rack::Response.new
  response.status = 422
  response.write("422 Unprocessable Entity\n")
  response.write(validate_error.message)
  response.finish
end
validate(env) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 27
def validate(env)
  params = Rack::App::Params.new(env).merged_params
  validation_results(env, params)
end
validate_array(type, elements_type, key, *elements) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 69
def validate_array(type, elements_type, key, *elements)
  values = elements.map { |str| parse(elements_type, str) }

  if values.include?(nil)
    invalid_type_of_error(key, type, elements_type)
  end
end
validate_invalid_params(params) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 62
def validate_invalid_params(params)
  valid_keys = @descriptor[:required].keys + @descriptor[:optional].keys
  (params.keys - valid_keys).each do |key|
    invalid_key_error(key)
  end
end
validate_key(key, properties, params) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 52
def validate_key(key, properties, params)
  missing_key_error(key, properties[:class]) unless params.key?(key)

  if properties[:of]
    validate_array(properties[:class], properties[:of], key, *params[key])
  elsif parse(properties[:class], params[key]).nil?
    invalid_type_error(key, properties[:class])
  end
end
validate_optional_params(env, params) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 44
def validate_optional_params(env, params)
  @descriptor[:optional].each do |key, properties|
    next unless params.key?(key)

    validate_key(key, properties, params)
  end
end
validate_required_params(env, params) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 38
def validate_required_params(env, params)
  @descriptor[:required].each do |key, properties|
    validate_key(key, properties, params)
  end
end
validation_results(env, params) click to toggle source
# File lib/rack/app/middlewares/params/validator.rb, line 32
def validation_results(env, params)
  validate_required_params(env, params)
  validate_optional_params(env, params)
  validate_invalid_params(params)
end