github.com/taubyte/tau-cli@v0.1.13-0.20240326000942-487f0d57edfc/prompts/project/select.go (about) 1 package projectPrompts 2 3 import ( 4 "strings" 5 6 "github.com/taubyte/tau-cli/env" 7 "github.com/taubyte/tau-cli/flags" 8 projectI18n "github.com/taubyte/tau-cli/i18n/project" 9 projectLib "github.com/taubyte/tau-cli/lib/project" 10 "github.com/taubyte/tau-cli/prompts" 11 client "github.com/taubyte/tau/clients/http/auth" 12 13 "github.com/urfave/cli/v2" 14 ) 15 16 /* 17 GetOrSelect will try to get the project from a name flag 18 if it is not set in the flag it will offer a selection menu 19 */ 20 func GetOrSelect(ctx *cli.Context, checkEnv bool) (*client.Project, error) { 21 name := ctx.String(flags.Name.Name) 22 23 // Try to get selected project 24 if len(name) == 0 && checkEnv { 25 name, _ = env.GetSelectedProject() 26 } 27 28 projects, err := projectLib.ListResources() 29 if err != nil { 30 return nil, projectI18n.GettingProjectsFailed(err) 31 } 32 33 // Try to select a project 34 if len(name) == 0 && len(projects) > 0 { 35 projectOptions := make([]string, len(projects)) 36 for idx, p := range projects { 37 projectOptions[idx] = p.Name 38 } 39 40 name, err = prompts.SelectInterface(projectOptions, selectAProject, projectOptions[0]) 41 if err != nil { 42 return nil, projectI18n.SelectingAProjectPromptFailed(err) 43 } 44 } 45 46 if len(name) != 0 { 47 project, err := matchLowercase(name, projects) 48 if err != nil { 49 return nil, err 50 } 51 52 return project, nil 53 } 54 55 return nil, projectI18n.ErrorNoProjectsFound 56 } 57 58 func GetSelectOrDeselect(ctx *cli.Context) (project *client.Project, deselect bool, err error) { 59 currentlySelected, _ := env.GetSelectedProject() 60 if len(currentlySelected) == 0 { 61 project, err = GetOrSelect(ctx, false) 62 return 63 } 64 65 name := ctx.String(flags.Name.Name) 66 projects, err := projectLib.ListResources() 67 if err != nil { 68 return nil, false, projectI18n.GettingProjectsFailed(err) 69 } 70 71 options := make([]string, len(projects)+1 /*accounting for (none)*/) 72 for idx, _project := range projects { 73 options[idx] = _project.Name 74 } 75 76 options[len(options)-1] = prompts.SelectionNone 77 78 // Try to select a project 79 if len(name) == 0 && len(options) > 1 { 80 name, err = prompts.SelectInterface(options, selectAProject, currentlySelected) 81 if err != nil { 82 err = projectI18n.SelectingAProjectPromptFailed(err) 83 return 84 } 85 } 86 87 if len(name) > 0 { 88 var deselect bool 89 if name == prompts.SelectionNone { 90 deselect = true 91 name = currentlySelected 92 } 93 94 project, err = matchLowercase(name, projects) 95 if err != nil { 96 return nil, false, err 97 } 98 99 return project, deselect, nil 100 } 101 102 return nil, false, projectI18n.ErrorNoProjectsFound 103 } 104 105 func matchLowercase(name string, projects []*client.Project) (*client.Project, error) { 106 nameLC := strings.ToLower(name) 107 108 for _, project := range projects { 109 if nameLC == strings.ToLower(project.Name) { 110 return project, nil 111 } 112 } 113 114 return nil, projectI18n.ProjectNotFound(name) 115 }