Use a command registry

This commit is contained in:
Douglas Eichelberger 2024-03-04 07:51:43 -08:00
parent cbcb221de6
commit 5364b6ef03
3 changed files with 23 additions and 6 deletions

View File

@ -1,6 +1,8 @@
# typed: strong
# frozen_string_literal: true
require "command_registry"
module Homebrew
class AbstractCommand
extend T::Helpers
@ -12,13 +14,9 @@ module Homebrew
sig { params(subclass: T.class_of(AbstractCommand)).void }
def inherited(subclass)
super
@cmds ||= T.let({}, T.nilable(T::Hash[String, T.class_of(AbstractCommand)]))
@cmds[subclass.command_name] = subclass
CommandRegistry.register(subclass)
end
sig { params(name: String).returns(T.nilable(T.class_of(AbstractCommand))) }
def command(name) = @cmds&.[](name)
sig { returns(String) }
def command_name = T.must(name).split("::").fetch(-1).downcase
end

View File

@ -84,7 +84,7 @@ begin
end
if internal_cmd || Commands.external_ruby_v2_cmd_path(cmd)
cmd_class = Homebrew::AbstractCommand.command(T.must(cmd))
cmd_class = Homebrew::CommandRegistry.command(T.must(cmd))
if cmd_class
cmd_class.new.run
else

View File

@ -0,0 +1,19 @@
# typed: strong
# frozen_string_literal: true
module Homebrew
module CommandRegistry
extend T::Helpers
Cmd = T.type_alias { T.class_of(AbstractCommand) } # rubocop:disable Style/MutableConstant
sig { params(subclass: Cmd).void }
def self.register(subclass)
@cmds ||= T.let({}, T.nilable(T::Hash[String, Cmd]))
@cmds[subclass.command_name] = subclass
end
sig { params(name: String).returns(T.nilable(Cmd)) }
def self.command(name) = @cmds&.[](name)
end
end