diff --git a/cmd/select/account/account.go b/cmd/select/account/account.go index e4e2bb4..7df0b21 100644 --- a/cmd/select/account/account.go +++ b/cmd/select/account/account.go @@ -34,6 +34,9 @@ func AccountCmd() *cobra.Command { cmd.Flags().StringVarP(&opts.Account, "account", "a", "", "Account to select") cmd.Flags().StringVar(&opts.Host, "host", "", "Pangolin host where account is located") + _ = cmd.RegisterFlagCompletionFunc("account", completeAccountFlag) + _ = cmd.RegisterFlagCompletionFunc("host", completeHostFlag) + return cmd } diff --git a/cmd/select/account/completion.go b/cmd/select/account/completion.go new file mode 100644 index 0000000..d120609 --- /dev/null +++ b/cmd/select/account/completion.go @@ -0,0 +1,38 @@ +package account + +import ( + "maps" + "slices" + "strings" + + "github.com/fosrl/cli/internal/config" + "github.com/spf13/cobra" +) + +func completeAccountFlag(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + accountStore := config.AccountStoreFromContext(cmd.Context()) + + candidateSet := make(map[string]struct{}) + + for _, v := range accountStore.Accounts { + if strings.HasPrefix(v.Email, toComplete) { + candidateSet[v.Email] = struct{}{} + } + } + + return slices.Collect(maps.Keys(candidateSet)), cobra.ShellCompDirectiveNoFileComp +} + +func completeHostFlag(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + accountStore := config.AccountStoreFromContext(cmd.Context()) + + candidateSet := make(map[string]struct{}) + + for _, v := range accountStore.Accounts { + if strings.HasPrefix(v.Host, toComplete) { + candidateSet[v.Host] = struct{}{} + } + } + + return slices.Collect(maps.Keys(candidateSet)), cobra.ShellCompDirectiveNoFileComp +} diff --git a/cmd/select/org/completion.go b/cmd/select/org/completion.go new file mode 100644 index 0000000..c303487 --- /dev/null +++ b/cmd/select/org/completion.go @@ -0,0 +1,34 @@ +package org + +import ( + "fmt" + "strings" + + "github.com/fosrl/cli/internal/api" + "github.com/fosrl/cli/internal/config" + "github.com/spf13/cobra" +) + +func completeOrgID(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + apiClient := api.FromContext(cmd.Context()) + accountStore := config.AccountStoreFromContext(cmd.Context()) + + activeAccount, err := accountStore.ActiveAccount() + if err != nil { + return []string{}, cobra.ShellCompDirectiveNoFileComp + } + + orgsResponse, err := apiClient.ListUserOrgs(activeAccount.UserID) + if err != nil { + return []string{}, cobra.ShellCompDirectiveNoFileComp + } + + var candidates []string + for _, org := range orgsResponse.Orgs { + if strings.HasPrefix(org.OrgID, toComplete) { + candidates = append(candidates, fmt.Sprintf("%s\t%s", org.OrgID, org.Name)) + } + } + + return candidates, cobra.ShellCompDirectiveNoFileComp +} diff --git a/cmd/select/org/org.go b/cmd/select/org/org.go index f3943b4..fd45ca8 100644 --- a/cmd/select/org/org.go +++ b/cmd/select/org/org.go @@ -33,6 +33,8 @@ func OrgCmd() *cobra.Command { cmd.Flags().StringVar(&opts.OrgID, "org", "", "Organization `ID` to select") + _ = cmd.RegisterFlagCompletionFunc("org", completeOrgID) + return cmd }