diff --git a/cmd/setup/cmd_wizard.go b/cmd/setup/cmd_wizard.go index b638bf1..4174565 100644 --- a/cmd/setup/cmd_wizard.go +++ b/cmd/setup/cmd_wizard.go @@ -7,9 +7,9 @@ import ( "os" "slices" - "forge.lthn.ai/core/cli/pkg/cli" "dappco.re/go/core/i18n" "dappco.re/go/core/scm/repos" + "forge.lthn.ai/core/cli/pkg/cli" "golang.org/x/term" ) @@ -39,6 +39,9 @@ func promptProjectName(defaultName string) (string, error) { // runPackageWizard presents an interactive multi-select UI for package selection. func runPackageWizard(reg *repos.Registry, preselectedTypes []string) ([]string, error) { allRepos := reg.List() + if len(preselectedTypes) > 0 { + allRepos = filterReposByTypes(allRepos, preselectedTypes) + } // Build options var options []string @@ -57,6 +60,10 @@ func runPackageWizard(reg *repos.Registry, preselectedTypes []string) ([]string, options = append(options, label) } + if len(options) == 0 { + return nil, nil + } + fmt.Println(cli.TitleStyle.Render(i18n.T("cmd.setup.wizard.package_selection"))) fmt.Println(i18n.T("cmd.setup.wizard.selection_hint")) @@ -87,6 +94,33 @@ func runPackageWizard(reg *repos.Registry, preselectedTypes []string) ([]string, return selected, nil } +func filterReposByTypes(repos []*repos.Repo, allowedTypes []string) []*repos.Repo { + if len(allowedTypes) == 0 { + return repos + } + + allowed := make(map[string]struct{}, len(allowedTypes)) + for _, repoType := range allowedTypes { + if repoType == "" { + continue + } + allowed[repoType] = struct{}{} + } + + if len(allowed) == 0 { + return repos + } + + filtered := make([]*repos.Repo, 0, len(repos)) + for _, repo := range repos { + if _, ok := allowed[repo.Type]; ok { + filtered = append(filtered, repo) + } + } + + return filtered +} + // confirmClone asks for confirmation before cloning. func confirmClone(count int, target string) (bool, error) { confirmed := cli.Confirm(i18n.T("cmd.setup.wizard.confirm_clone", map[string]any{"Count": count, "Target": target})) diff --git a/cmd/setup/cmd_wizard_test.go b/cmd/setup/cmd_wizard_test.go new file mode 100644 index 0000000..d033995 --- /dev/null +++ b/cmd/setup/cmd_wizard_test.go @@ -0,0 +1,34 @@ +package setup + +import ( + "testing" + + "dappco.re/go/core/scm/repos" + "github.com/stretchr/testify/require" +) + +func TestFilterReposByTypes_Good(t *testing.T) { + reposList := []*repos.Repo{ + {Name: "foundation-a", Type: "foundation"}, + {Name: "module-a", Type: "module"}, + {Name: "product-a", Type: "product"}, + } + + filtered := filterReposByTypes(reposList, []string{"module", "product"}) + + require.Len(t, filtered, 2) + require.Equal(t, "module-a", filtered[0].Name) + require.Equal(t, "product-a", filtered[1].Name) +} + +func TestFilterReposByTypes_EmptyFilter_Good(t *testing.T) { + reposList := []*repos.Repo{ + {Name: "foundation-a", Type: "foundation"}, + {Name: "module-a", Type: "module"}, + } + + filtered := filterReposByTypes(reposList, nil) + + require.Len(t, filtered, 2) + require.Equal(t, reposList, filtered) +}