diff --git a/lib/grape/validations/contract_scope.rb b/lib/grape/validations/contract_scope.rb index 0255051b4..3b66df572 100644 --- a/lib/grape/validations/contract_scope.rb +++ b/lib/grape/validations/contract_scope.rb @@ -24,17 +24,18 @@ def initialize(api, contract = nil, &block) validator_options = { validator_class: Validator, - opts: { schema: contract } + opts: { schema: contract, fail_fast: false } } api.namespace_stackable(:validations, validator_options) end - class Validator + class Validator < Grape::Validations::Validators::Base attr_reader :schema - def initialize(*_args, schema:) - @schema = schema + def initialize(_attrs, _options, _required, _scope, opts) + super + @schema = opts.fetch(:schema) end # Validates a given request. @@ -49,21 +50,17 @@ def validate(request) return end - errors = [] - - res.errors.messages.each do |message| - full_name = message.path.first.to_s + raise Grape::Exceptions::ValidationArrayErrors.new(build_errors_from_messages(res.errors.messages)) + end - full_name += "[#{message.path[1..].join('][')}]" if message.path.size > 1 + private - errors << Grape::Exceptions::Validation.new(params: [full_name], message: message.text) + def build_errors_from_messages(messages) + messages.map do |message| + full_name = message.path.first.to_s + full_name << "[#{message.path[1..].join('][')}]" if message.path.size > 1 + Grape::Exceptions::Validation.new(params: [full_name], message: message.text) end - - raise Grape::Exceptions::ValidationArrayErrors.new(errors) - end - - def fail_fast? - false end end end