Sha256: d8155a87533f013944e67f6fea6106ccff7e5691ee459efedc43a36775d78d71

Contents?: true

Size: 1.52 KB

Versions: 50

Compression:

Stored size: 1.52 KB

Contents

# frozen_string_literal: true

module Ree::Contracts
  module ArgContracts
    class SplatOf
      include Ree::Contracts::Truncatable
      
      attr_reader :validator
      
      class << self
        def [](contract)
          new(contract)
        end
      end

      def initialize(contract)
        forbidden_class_contracts = Ree::Contracts::Validators::FORBIDDEN_CONTRACTS

        contract_name = if forbidden_class_contracts.include?(contract)
          contract.to_s
        elsif forbidden_class_contracts.include?(contract.class)
          contract.class.to_s
        end

        if contract_name
          raise BadContractError, "#{contract_name} contract is not allowed to use inside SplatOf contract"
        end

        @validator = Validators.fetch_for(contract)
      end

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

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

      def message(value, name, lvl = 1)
        unless value.is_a?(Array)
          return "expected #{to_s}, 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/splat_of.rb
ree-1.1.0 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.47 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.46 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.45 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.44 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.43 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.42 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.41 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.40 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.39 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.38 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.37 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.36 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.35 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.34 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.33 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.32 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.31 lib/ree/contracts/arg_contracts/splat_of.rb
ree-1.0.30 lib/ree/contracts/arg_contracts/splat_of.rb