module Sinatra::Schema::ParamValidation

Public Instance Methods

validate_params!(params, properties) click to toggle source
# File lib/sinatra/schema/param_validation.rb, line 4
def validate_params!(params, properties)
  required_properties = properties.map do |k, prop|
    # ignore nested properties for now, we'll cover these next
    k unless prop.is_a?(Hash) || prop.optional
  end.compact

  missing = required_properties.map(&:to_s).sort - params.keys.map(&:to_s).sort
  unless missing.empty?
    raise BadParams.new("Missing expected params: #{missing.join(',')}")
  end

  extra = params.keys.map(&:to_s).sort - properties.keys.map(&:to_s).sort
  unless extra.empty?
    raise BadParams.new("Unexpected params: #{extra.join(',')}")
  end

  properties.each do |id, definition|
    # handle nested params
    if definition.is_a?(Hash)
      validate_params!(params[id], definition)
    else
      unless definition.valid?(params[id])
        raise BadParams.new("Incorrect format for param '#{id}'. Please encode it as #{definition.type}")
      end
    end
  end
end