feat(cmd): register all Plan 3a modules in install command

Replace the init()-time hello toy-module registration with a
buildRegistry(cfg) helper called from the install RunE that wires the
ten Plan 3a modules (packages, gittools, starship, yazi, zsh, fonts,
zellij, themes, arduinocli, shellconfig) against a shared ExecRunner,
Pacman, Yay, and GitClient.
This commit is contained in:
MDietermann
2026-04-14 09:15:54 +02:00
parent 7de9d6c72c
commit fa946e9403

View File

@@ -13,7 +13,16 @@ import (
"github.com/MDietermann/ArduinoArchSetup/internal/config" "github.com/MDietermann/ArduinoArchSetup/internal/config"
"github.com/MDietermann/ArduinoArchSetup/internal/engine" "github.com/MDietermann/ArduinoArchSetup/internal/engine"
"github.com/MDietermann/ArduinoArchSetup/internal/module" "github.com/MDietermann/ArduinoArchSetup/internal/module"
"github.com/MDietermann/ArduinoArchSetup/internal/modules/hello" "github.com/MDietermann/ArduinoArchSetup/internal/modules/arduinocli"
"github.com/MDietermann/ArduinoArchSetup/internal/modules/fonts"
"github.com/MDietermann/ArduinoArchSetup/internal/modules/gittools"
"github.com/MDietermann/ArduinoArchSetup/internal/modules/packages"
"github.com/MDietermann/ArduinoArchSetup/internal/modules/shellconfig"
"github.com/MDietermann/ArduinoArchSetup/internal/modules/starship"
"github.com/MDietermann/ArduinoArchSetup/internal/modules/themes"
"github.com/MDietermann/ArduinoArchSetup/internal/modules/yazi"
"github.com/MDietermann/ArduinoArchSetup/internal/modules/zellij"
"github.com/MDietermann/ArduinoArchSetup/internal/modules/zsh"
"github.com/MDietermann/ArduinoArchSetup/internal/platform" "github.com/MDietermann/ArduinoArchSetup/internal/platform"
"github.com/MDietermann/ArduinoArchSetup/internal/privilege" "github.com/MDietermann/ArduinoArchSetup/internal/privilege"
"github.com/MDietermann/ArduinoArchSetup/internal/state" "github.com/MDietermann/ArduinoArchSetup/internal/state"
@@ -24,14 +33,35 @@ import (
var version = "dev" var version = "dev"
// Registry is the global module registry. Tasks in Plan 3 will register // buildRegistry constructs a module registry populated with all Plan 3a
// real modules into it via init(). Task 12 registers the hello toy module. // modules, wired against the provided config and platform dependencies.
var Registry = module.NewRegistry() // It replaces the earlier init()-time hello-module registration now that
// the real modules need runtime config to be instantiated.
func buildRegistry(cfg config.Config) (*module.Registry, error) {
reg := module.NewRegistry()
runner := platform.ExecRunner{}
pm := platform.NewPacman(runner)
yay := platform.NewYay(runner)
git := platform.GitClient{Runner: runner}
func init() { mods := []module.Module{
if err := Registry.Register(hello.Module{}); err != nil { packages.New(cfg.Packages.Base, pm),
panic(err) gittools.New([]string{"lazygit"}, pm),
starship.New([]string{"starship"}, pm),
yazi.New([]string{"yazi"}, pm),
zsh.New(cfg.Zsh, pm, git),
fonts.New(cfg.Fonts, pm, yay),
zellij.New(cfg.Zellij, pm),
themes.New(cfg.Themes),
arduinocli.New(cfg.ArduinoCLI, runner),
shellconfig.New(cfg.ShellConfig),
} }
for _, m := range mods {
if err := reg.Register(m); err != nil {
return nil, err
}
}
return reg, nil
} }
func main() { func main() {
@@ -92,7 +122,12 @@ func newInstallCmd() *cobra.Command {
return err return err
} }
selected, err := resolveSelection(Registry, cfg, only, skip) reg, err := buildRegistry(cfg)
if err != nil {
return fmt.Errorf("build registry: %w", err)
}
selected, err := resolveSelection(reg, cfg, only, skip)
if err != nil { if err != nil {
return err return err
} }
@@ -117,7 +152,7 @@ func newInstallCmd() *cobra.Command {
// always uses plain output because the dashboard has nothing // always uses plain output because the dashboard has nothing
// to animate when no Apply happens. // to animate when no Apply happens.
reporter := engine.NewPlainReporter(os.Stdout) reporter := engine.NewPlainReporter(os.Stdout)
sum, runErr = engine.Run(ctx, Registry, engine.RunOptions{ sum, runErr = engine.Run(ctx, reg, engine.RunOptions{
Selected: selected, Selected: selected,
DryRun: dryRun, DryRun: dryRun,
HaltOnError: halt, HaltOnError: halt,
@@ -126,7 +161,7 @@ func newInstallCmd() *cobra.Command {
} else { } else {
// TUI path: wizard → dashboard. If the user does not confirm, // TUI path: wizard → dashboard. If the user does not confirm,
// we exit cleanly with a zero-summary and no error. // we exit cleanly with a zero-summary and no error.
initial := tui.NewWizardState(cfg, Registry) initial := tui.NewWizardState(cfg, reg)
// Pre-filter the wizard's module list by --only/--skip so the // Pre-filter the wizard's module list by --only/--skip so the
// user cannot accidentally widen selection in the TUI beyond // user cannot accidentally widen selection in the TUI beyond
// what they asked for on the CLI. // what they asked for on the CLI.
@@ -140,7 +175,7 @@ func newInstallCmd() *cobra.Command {
} }
} }
finalState, confirmed, werr := wizard.Run(ctx, Registry, initial) finalState, confirmed, werr := wizard.Run(ctx, reg, initial)
if werr != nil { if werr != nil {
return werr return werr
} }
@@ -149,7 +184,7 @@ func newInstallCmd() *cobra.Command {
return nil return nil
} }
// Either the CLI flag or the wizard toggle can force halt-on-error. // Either the CLI flag or the wizard toggle can force halt-on-error.
sum, runErr = dashboard.Run(ctx, Registry, finalState, halt || finalState.HaltOnError) sum, runErr = dashboard.Run(ctx, reg, finalState, halt || finalState.HaltOnError)
} }
ended := time.Now().UTC() ended := time.Now().UTC()