class Tryouts::Drill::Sergeant::CLI


The sergeant responsible for running command-line interface drills.
= CLI

def initialize(*args)

def initialize(*args)
  @rbox_args = args
  @rbox = Rye::Box.new
end

def run(block, context=nil, &inline)

NOTE: Context is ignored for the CLI Sergeant.
def run(block, context=nil, &inline)
  # A Proc object takes precedence over an inline block. 
  runtime = (block.nil? ? inline : block)
  response = Tryouts::Drill::Reality.new
  begin
    if runtime.nil?
      ret = @rbox.send *rbox_args
    else
      ret = @rbox.instance_eval &runtime
    end
    response.rcode = ret.exit_code
    response.output = ret.stdout.size == 1 ? ret.stdout.first : Array.new(ret.stdout)  # Cast the Rye::Rap object
    response.emsg = ret.stderr unless ret.stderr.empty?
  rescue Rye::CommandNotFound => ex
    response.rcode = -2
    response.emsg = "[#{@rbox.host}] Command not found: #{ex.message}"
    response.backtrace = ex.backtrace
  rescue Rye::CommandError => ex
    response.rcode = ex.exit_code
    response.output = ex.stdout
    response.emsg = ex.stderr
  end
  response
end