Sha256: e30de6917f62d4edbd7f7f108364eba845e72d9ca11969bf2e68d6c43bb1eddf

Contents?: true

Size: 1.07 KB

Versions: 3

Compression:

Stored size: 1.07 KB

Contents

# frozen string literal: true

require 'dry-validation'
require 'spy_alley_application/types/coercible_integer_one_to_six'

module SpyAlleyApplication
  module Validator
    class NewGame < Dry::Validation::Contract
      params do
        required(:seat_assignments).array(:hash) do
          required(:id).filled(:integer)
          optional(:seat).filled(SpyAlleyApplication::Types::CoercibleIntegerOneToSix)
        end
      end

      rule(:seat_assignments) do
        id_list = values[:seat_assignments].map{|s| s[:id]}
        seat_list = values[:seat_assignments].map{|s| s[:seat]}.reject(&:nil?)

        if values[:seat_assignments].size < 2 || values[:seat_assignments].size > 6
          key.failure({text: 'must be between 2 and 6 players', status: 400})
        end

        if !id_list.uniq.size.eql?(id_list.size)
          key.failure({text: 'all player ids must be distinct', status: 400})
        end

        if !seat_list.uniq.size.eql?(seat_list.size)
          key.failure({text: 'all player seats must be distinct', status: 400})
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
spy_alley_application-0.3.2 lib/spy_alley_application/validator/new_game.rb
spy_alley_application-0.3.1 lib/spy_alley_application/validator/new_game.rb
spy_alley_application-0.3.0 lib/spy_alley_application/validator/new_game.rb