class CommandClass

Public Class Methods

commandify(cmd_cls, dependencies, inputs, &blk) click to toggle source

Turns the class into a command class

# File lib/command_class.rb, line 15
  def self.commandify(cmd_cls, dependencies, inputs, &blk)
    cmd_cls.const_set('DEFAULT_DEPS', dependencies)

    cmd_cls.class_eval <<~RUBY
      def initialize(**passed_deps)
        deps = DEFAULT_DEPS.merge(passed_deps)
        deps.each { |name, val| instance_variable_set('@' + name.to_s, val) }
      end

      def call(#{cmd_call_signature(inputs)})
        Call.new(#{call_ctor_args(dependencies, inputs)}).()
      end
    RUBY

    call_class = Class.new(cmd_cls, &blk)
    call_class.class_eval <<~RUBY
      def initialize(#{call_ctor_sig(dependencies, inputs)})
        #{set_input_attrs(dependencies, inputs)}
      end
    RUBY

    cmd_cls.const_set('Call', call_class)
    cmd_cls
  end
new(dependencies:, inputs:, &blk) click to toggle source
# File lib/command_class.rb, line 9
def self.new(dependencies:, inputs:, &blk)
  commandify(Class.new, dependencies, inputs, &blk)
end

Private Class Methods

all_args(deps, inputs) click to toggle source
# File lib/command_class.rb, line 62
def all_args(deps, inputs)
  deps.keys + inputs
end
call_ctor_args(deps, inputs) click to toggle source
# File lib/command_class.rb, line 58
def call_ctor_args(deps, inputs)
  [deps.keys.map { |x| "@#{x}" } + inputs].join(', ')
end
call_ctor_sig(deps, inputs) click to toggle source
# File lib/command_class.rb, line 54
def call_ctor_sig(deps, inputs)
  all_args(deps, inputs).join(', ')
end
cmd_call_signature(inputs) click to toggle source

TODO: allow for unnamed as well

# File lib/command_class.rb, line 46
def cmd_call_signature(inputs)
  inputs.map {|x| "#{x}:" }.join(', ')
end
set_input_attrs(deps, inputs) click to toggle source
# File lib/command_class.rb, line 50
def set_input_attrs(deps, inputs)
  all_args(deps, inputs).map {|x| "@#{x} = #{x}" }.join('; ')
end