lib/selective-ruby-core.rb



# frozen_string_literal: true

require "zeitwerk"

loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
loader.ignore("#{__dir__}/selective-ruby-core.rb")
loader.setup

module Selective
  module Ruby
    module Core
      class Error < StandardError; end

      @@available_runners = {}

      def self.register_runner(name, runner_class)
        @@available_runners[name] = runner_class
      end

      def self.runner_for(name)
        @@available_runners[name] || raise("Unknown runner #{name}")
      end

      class Init
        def initialize(args)
          @debug = !args.delete("--debug").nil?
          @log = !args.delete("--log").nil?
          @runner_name, @args, @command = parse_args(args)
          require_runner
        end

        def self.run(args)
          new(args).send(:run)
        end

        private

        attr_reader :debug, :log, :runner_name, :args, :command

        def run
          Selective::Ruby::Core::Controller.new(runner, debug: debug, log: log).send(command)
        end

        def parse_args(args)
          # Returns runner_name, args, command
          if args[0] == "exec" # e.g. selective exec rspec
            [args[1], args[2..], :exec]
          else # e.g. selective rspec
            [args[0], args[1..], :start]
          end
        end

        def runner
          Selective::Ruby::Core.runner_for(runner_name).new(args)
        end

        def require_runner
          require "selective-ruby-#{runner_name}"
        rescue LoadError
          nil
        end
      end
    end
  end
end