Sha256: 6032923d89563eb35d374c4e768ff4b37a61c9bbb760de8149253cf3a2dc6b61

Contents?: true

Size: 1.19 KB

Versions: 50

Compression:

Stored size: 1.19 KB

Contents

# frozen_string_literal: true

require 'set'

module Ree::Contracts
  module ArgContracts
    class SetOf
      extend Ree::Contracts::ArgContracts::Squarable
      include Ree::Contracts::Truncatable

      attr_reader :validator
      
      def initialize(*contracts)
        if contracts.size != 1
          raise BadContractError, 'SetOf should accept exactly one contract'
        end

        @validator = Validators.fetch_for(contracts.first)
      end

      def valid?(value)
        value.is_a?(Set) &&
          value.all?(&validator.method(:call))
      end

      def to_s
        "SetOf[#{validator.to_s}]"
      end

      def message(value, name, lvl = 1)
        unless value.is_a?(Set)
          return "expected Set, got #{value.class} => #{truncate(value.inspect)}"
        end

        errors = []
        sps = "  " * lvl

        value.each_with_index do |val, idx|
          next if validator.call(val)

          msg = validator.message(val, "#{name}[#{idx}]", lvl + 1)
          errors << "\n\t#{sps} - #{name}[#{idx}]: #{msg}"

          if errors.size > 3
            errors << "\n\t#{sps} - ..."
            break
          end
        end

        errors.join
      end
    end
  end
end

Version data entries

50 entries across 50 versions & 1 rubygems

Version Path
ree-1.1.1 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.1.0 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.47 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.46 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.45 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.44 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.43 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.42 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.41 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.40 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.39 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.38 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.37 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.36 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.35 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.34 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.33 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.32 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.31 lib/ree/contracts/arg_contracts/set_of.rb
ree-1.0.30 lib/ree/contracts/arg_contracts/set_of.rb