Sha256: 66951727141d3001bc921ca1870a75cbc18eb800d2d53e9ec270cbb0ccda192b

Contents?: true

Size: 1.5 KB

Versions: 4

Compression:

Stored size: 1.5 KB

Contents

require "singleton"
require "harmoniser"
require "harmoniser/parser"
require "harmoniser/launcher"

module Harmoniser
  class CLI
    include Singleton

    SIGNAL_HANDLERS = {
      "INT" => lambda { |cli, signal| raise Interrupt },
      "TERM" => lambda { |cli, signal| raise Interrupt }
    }
    SIGNAL_HANDLERS.default = lambda { |cli, signal| cli.logger.info("Default signal handler executed since there is no handler defined: signal = `#{signal}`") }

    attr_reader :logger

    def initialize
      @configuration = Harmoniser.default_configuration
      @logger = Harmoniser.logger
    end

    def call
      parse_options
      define_signals
      run
    end

    private

    attr_reader :configuration

    def parse_options
      options = Parser.new(logger: @logger).call(ARGV)
      configuration.options_with(**options)
    end

    def define_signals
      @read_io, @write_io = IO.pipe

      ["INT", "TERM"].each do |sig|
        Signal.trap(sig) do
          @write_io.puts(sig)
        end
      end
    end

    def run
      launcher = Launcher.new
      launcher.start

      while @read_io.wait_readable
        signal = @read_io.gets.strip
        handle_signal(signal)
      end
    rescue Interrupt
      logger.info("Shutting down!")
      launcher.stop
      @write_io.close
      @read_io.close
      logger.info("Bye!")
      exit(0)
    end

    def handle_signal(signal)
      logger.info("Signal received: signal = `#{signal}`")
      SIGNAL_HANDLERS[signal].call(self, signal)
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
harmoniser-0.4.0 lib/harmoniser/cli.rb
harmoniser-0.3.0 lib/harmoniser/cli.rb
harmoniser-0.2.0 lib/harmoniser/cli.rb
harmoniser-0.1.0 lib/harmoniser/cli.rb