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  }