class Funk::Fn

Constants

REQUIRED_PARAM_TYPES

Attributes

dependencies[R]
name[R]

Public Class Methods

new(name, callable) click to toggle source
# File lib/funk/fn.rb, line 12
def initialize(name, callable)
  @name = name
  @parameters = callable.parameters
  @dependencies = @parameters.map(&:last)
  @fn = callable
end

Public Instance Methods

call(hash) click to toggle source
# File lib/funk/fn.rb, line 19
def call(hash)
  assert_dependencies_present_in(hash)
  args = extract_argument_values(hash)

  @fn.call(*args)
end

Private Instance Methods

assert_dependencies_present_in(hash) click to toggle source
# File lib/funk/fn.rb, line 28
def assert_dependencies_present_in(hash)
  present_keys = Set.new(hash.keys)
  deps = Set.new(dependencies)
  unless deps.subset?(present_keys)
    raise MissingDependenciesException, "Function #{name.inspect} is missing dependencies #{deps.difference(present_keys).to_a.inspect}"
  end
end
extract_argument_values(hash) click to toggle source

Check for required arguments which are missing from input values. If an argument is optional we don’t raise, and we also don’t use ‘nil` so that the proper default value will be used by the callable.

One might be tempted to raise this dependency logic up a level but be warned: one Fn instance could require an argument which is optional in another Fn.

NOTE: we don’t currently support keyword args

# File lib/funk/fn.rb, line 45
def extract_argument_values(hash)
  missing = []
  args = []
  @parameters.each do |(type, name)|
    value = hash[name]
    if value != Funk::NO_INPUT_PROVIDED
      args << value
    elsif REQUIRED_PARAM_TYPES.include?(type)
      missing << name
    end
  end

  if missing.empty?
    args
  else
    raise MissingDependenciesException, "Function #{name.inspect} is missing dependencies #{missing.inspect}"
  end
end