1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
# frozen_string_literal: true
require 'delegate'
require 'aruba/processes/spawn_process'
require 'aruba/processes/in_process'
require 'aruba/processes/debug_process'
# Aruba
module Aruba
# Command
#
# This class is not meant for direct use - Command.new, though it's API is
# public. As it is just a wrapper class, have a look at `BasicProcess` and
# the like for the public API.
#
# @see BasicProcess
# @see SpawnProcess
#
# @private
class Command < SimpleDelegator
private
attr_reader :event_bus
public
def initialize(command, opts = {})
launchers = []
launchers << Processes::DebugProcess
launchers << Processes::InProcess
launchers << Processes::SpawnProcess
klass = launchers.find { |l| l.match? opts[:mode] }
launcher = klass.new(
command,
opts.fetch(:exit_timeout),
opts.fetch(:io_wait_timeout),
opts.fetch(:working_directory),
opts.fetch(:environment),
opts.fetch(:main_class),
opts.fetch(:stop_signal),
opts.fetch(:startup_wait_time)
)
super(launcher)
@event_bus = opts.fetch(:event_bus)
rescue KeyError => e
raise ArgumentError, e.message
end
# Stop command
def stop(*)
return if __getobj__.stopped?
__getobj__.stop
event_bus.notify Events::CommandStopped.new(self)
self
end
# Terminate command
def terminate(*)
return if __getobj__.stopped?
__getobj__.terminate
event_bus.notify Events::CommandStopped.new(self)
self
end
# Start command
def start
__getobj__.start
event_bus.notify Events::CommandStarted.new(self)
self
end
alias run! start
end
end
|