Class: Kaal::SignalHandlerChain

Inherits:
Object
  • Object
show all
Defined in:
lib/kaal/runtime/signal_handler_chain.rb,
sig/kaal/runtime/signal_handler_chain.rbs

Overview

Invokes a previously registered signal handler when it is safe to do so.

Constant Summary collapse

RESERVED_COMMAND_HANDLERS =

Returns:

  • (::Array["DEFAULT" | "IGNORE"])
%w[DEFAULT IGNORE].freeze

Instance Method Summary collapse

Constructor Details

#initialize(signal:, previous_handler:, logger:) ⇒ SignalHandlerChain

Returns a new instance of SignalHandlerChain.

Parameters:

  • signal: (Kaal::rbs_any)
  • previous_handler: (Kaal::rbs_any)
  • logger: (Kaal::rbs_any)


12
13
14
15
16
# File 'lib/kaal/runtime/signal_handler_chain.rb', line 12

def initialize(signal:, previous_handler:, logger:)
  @signal = signal
  @previous_handler = previous_handler
  @logger = logger
end

Instance Method Details

#call ⇒ void

This method returns an undefined value.

Parameters:

  • (Kaal::rbs_any)
  • (Kaal::rbs_any)


18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/kaal/runtime/signal_handler_chain.rb', line 18

def call(...)
  return unless @previous_handler

  case @previous_handler
  when Proc, Method
    invoke_callable(...)
  when String
    return if RESERVED_COMMAND_HANDLERS.include?(@previous_handler)

    @logger&.debug("Previous #{@signal} handler was a command: #{@previous_handler}")
  end
end

#invoke_callable(*args) ⇒ Kaal::rbs_any

Parameters:

  • args (Kaal::rbs_any)

Returns:

  • (Kaal::rbs_any)


33
34
35
36
37
38
39
40
# File 'lib/kaal/runtime/signal_handler_chain.rb', line 33

def invoke_callable(*args)
  arity = @previous_handler.arity
  return @previous_handler.call if arity.zero?

  argument_length = args.length
  argument_count = arity.negative? ? argument_length : [arity, argument_length].min
  @previous_handler.call(*args.first(argument_count))
end