class BloodContracts::Core::Contract

Meta refinement type, represents contract built upon input and output types

Public Class Methods

new(*args) click to toggle source

Metaprogramming around constructor Turns input types into a contract

@param [Hash<BC::Refined, BC::Refined>] expectations about possible

data input expressed in form of BC::Refined types

@return [BC::Refined] contract for data validation in form of

BC::Refined class
# File lib/blood_contracts/core/contract.rb, line 14
def new(*args)
  input, output =
    if (opts = args.last).is_a?(Hash)
      accumulate_contract(opts)
    else
      _validate_args!(args)
      args
    end
  BC::Pipe.new(input, output, names: %i[input output])
end

Private Class Methods

_validate_args!(args) click to toggle source

@private

# File lib/blood_contracts/core/contract.rb, line 26
              def _validate_args!(args)
        return if args.size == 2
        raise ArgumentError, <<~MESSAGE
          wrong number of arguments (given #{args.size}, expected 2)
        MESSAGE
      end
accumulate_contract(options) click to toggle source

@private

# File lib/blood_contracts/core/contract.rb, line 34
        def accumulate_contract(options)
  accumulate_contract = options.reduce({}) do |acc, (input, output)|
    prev_input, prev_output = acc.first
    { (input | prev_input) => (output | prev_output) }
  end
  accumulate_contract.first
end