Sha256: f458b8c05e83254d372d72c91e4547bca5bb698bc03913a89a914b76d83b2894

Contents?: true

Size: 1.61 KB

Versions: 1

Compression:

Stored size: 1.61 KB

Contents

require "sinatra/swagger/swagger_linked"

module Sinatra
  module Swagger
    module ParamValidator
      def self.registered(app)
        app.register Swagger::SwaggerLinked

        app.before do
          next if swagger_spec.nil?
          _, captures, spec = swagger_spec.values

          invalidities = Hash[(spec['parameters'] || []).map { |details|
            param_name = details['name']

            parameter = case details['in']
            when "query"
              params[param_name]
            when "path"
              captures[param_name]
            else
              raise NotImplementedError, "Can't cope with #{details['in']} parameters right now"
            end

            if !parameter
              next [param_name, :missing] if details['required'] && details['required'] != "false"
              next unless details['default']
              parameter = details['default']
            end

            begin
              parameter = ::Swagger.cast(parameter.to_s, details['type']) if parameter
            rescue ArgumentError
              next [param_name, :incorrect_type]
            end

            if %w{integer number}.include? details['type']
              too_large = details['maximum'] && parameter > details['maximum']
              too_small = details['minimum'] && parameter < details['minimum']
              next [param_name, :out_of_range] if too_large || too_small
            end

            params[param_name] = parameter

            nil
          }.compact]

          halt 400, invalidities.to_json if invalidities.any?
        end
      end
    end
  end

  register Swagger::ParamValidator
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sinatra-swagger-0.2.0 lib/sinatra/swagger/param_validator.rb