github.com/criteo/command-launcher@v0.0.0-20230407142452-fb616f546e98/cmd/rename.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/criteo/command-launcher/internal/backend"
     8  	"github.com/criteo/command-launcher/internal/console"
     9  	"github.com/criteo/command-launcher/internal/context"
    10  	"github.com/spf13/cobra"
    11  )
    12  
    13  type RenameFlags struct {
    14  	delete bool
    15  	list   bool
    16  }
    17  
    18  var (
    19  	renameFlags = RenameFlags{}
    20  )
    21  
    22  func AddRenameCmd(rootCmd *cobra.Command, appCtx context.LauncherContext, back backend.Backend) {
    23  	renameCmd := &cobra.Command{
    24  		Use:   "rename",
    25  		Short: "Rename installed command",
    26  		Long: fmt.Sprintf(`
    27  Rename installed command to a different name.
    28  
    29  Each command has an unique internal name in form of:
    30  [name]@[group]@[package]@[repository]
    31  
    32  For group command, the internal name is:
    33  [group]@@[package]@[repository]
    34  
    35  Without any conflict, the command name registered to Command Launcher is '%s [group] [name]'
    36  
    37  To change the group name:
    38  %s rename [group]@@[package]@[repository] [new group]
    39  
    40  To change the command name:
    41  %s rename [name]@[group]@[package]@[repository] [new name]`,
    42  			strings.ToTitle(appCtx.AppName()),
    43  			strings.ToTitle(appCtx.AppName()),
    44  			strings.ToTitle(appCtx.AppName())),
    45  		RunE: func(cmd *cobra.Command, args []string) error {
    46  			if renameFlags.list {
    47  				renamedCmds := back.AllRenamedCommands()
    48  				if renamedCmds == nil || len(renamedCmds) == 0 {
    49  					console.Highlight("No renamed command found")
    50  				} else {
    51  					fmt.Printf("%-20s  %s\n", "Name Alias", "Command Full Name")
    52  					for k, v := range renamedCmds {
    53  						fmt.Printf("%-20s: %s\n", v, k)
    54  					}
    55  				}
    56  				return nil
    57  			}
    58  
    59  			if len(args) < 2 && !renameFlags.delete {
    60  				cmd.Help()
    61  				return nil
    62  			}
    63  
    64  			if renameFlags.delete && len(args) < 1 {
    65  				cmd.Help()
    66  				return nil
    67  			}
    68  			icmd, err := back.FindCommandByFullName(args[0])
    69  			if err != nil {
    70  				console.Error("No command with full name %s", args[0])
    71  				return err
    72  			}
    73  
    74  			new_name := ""
    75  			if !renameFlags.delete {
    76  				new_name = args[1]
    77  			}
    78  			err = back.RenameCommand(icmd, new_name)
    79  			return err
    80  		},
    81  		ValidArgsFunction: func(c *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
    82  			options := []string{}
    83  			if len(args) == 0 {
    84  				for _, group := range back.GroupCommands() {
    85  					options = append(options, group.FullName())
    86  				}
    87  				for _, exec := range back.ExecutableCommands() {
    88  					options = append(options, exec.FullName())
    89  				}
    90  				return options, cobra.ShellCompDirectiveNoFileComp
    91  			}
    92  			return []string{}, cobra.ShellCompDirectiveNoFileComp
    93  		},
    94  	}
    95  
    96  	renameCmd.Flags().BoolVarP(&renameFlags.delete, "delete", "d", false, "delete renaming")
    97  	renameCmd.Flags().BoolVarP(&renameFlags.list, "list", "l", false, "list all renamed commands")
    98  	rootCmd.AddCommand(renameCmd)
    99  }