github.com/scaleway/scaleway-cli@v1.11.1/pkg/cli/x_completion.go (about)

     1  // Copyright (C) 2015 Scaleway. All rights reserved.
     2  // Use of this source code is governed by a MIT-style
     3  // license that can be found in the LICENSE.md file.
     4  
     5  package cli
     6  
     7  import (
     8  	"fmt"
     9  	"sort"
    10  	"strings"
    11  
    12  	"github.com/scaleway/scaleway-cli/pkg/api"
    13  	utils "github.com/scaleway/scaleway-cli/pkg/utils"
    14  )
    15  
    16  var cmdCompletion = &Command{
    17  	Exec:        runCompletion,
    18  	UsageLine:   "_completion [OPTIONS] CATEGORY",
    19  	Description: "Completion helper",
    20  	Help:        "Completion helper.",
    21  	Hidden:      true,
    22  	Examples: `
    23      $ scw _completion servers-all
    24      $ scw _completion images-all
    25      $ scw _completion snapshots-all
    26      $ scw _completion volumes-all
    27      $ scw _completion bootscripts-all
    28      $ scw _completion servers-names
    29      $ scw _completion images-names
    30      $ scw _completion snapshots-names
    31      $ scw _completion volumes-names
    32      $ scw _completion bootscripts-names
    33  `,
    34  }
    35  
    36  func init() {
    37  	cmdCompletion.Flag.BoolVar(&completionHelp, []string{"h", "-help"}, false, "Print usage")
    38  	cmdCompletion.Flag.BoolVar(&completionPrefix, []string{"-prefix"}, false, "Prefix entries")
    39  }
    40  
    41  // Flags
    42  var completionHelp bool   // -h, --help flag
    43  var completionPrefix bool // --prefix flag
    44  
    45  func wordifyName(name string, kind string) string {
    46  	ret := ""
    47  	if completionPrefix {
    48  		ret += kind + "\\:"
    49  	}
    50  	ret += utils.Wordify(name)
    51  	return ret
    52  }
    53  
    54  func runCompletion(cmd *Command, args []string) error {
    55  	if completionHelp {
    56  		return cmd.PrintUsage()
    57  	}
    58  	if len(args) != 1 {
    59  		return cmd.PrintShortUsage()
    60  	}
    61  
    62  	category := args[0]
    63  
    64  	elements := []string{}
    65  
    66  	switch category {
    67  	case "servers-all":
    68  		for identifier, fields := range cmd.API.Cache.Servers {
    69  			elements = append(elements, identifier, wordifyName(fields[api.CacheTitle], "server"))
    70  		}
    71  	case "servers-names":
    72  		for _, fields := range cmd.API.Cache.Servers {
    73  			elements = append(elements, wordifyName(fields[api.CacheTitle], "server"))
    74  		}
    75  	case "images-all":
    76  		for identifier, fields := range cmd.API.Cache.Images {
    77  			elements = append(elements, identifier, wordifyName(fields[api.CacheTitle], "image"))
    78  		}
    79  	case "images-names":
    80  		for _, fields := range cmd.API.Cache.Images {
    81  			elements = append(elements, wordifyName(fields[api.CacheTitle], "image"))
    82  		}
    83  	case "volumes-all":
    84  		for identifier, fields := range cmd.API.Cache.Volumes {
    85  			elements = append(elements, identifier, wordifyName(fields[api.CacheTitle], "volume"))
    86  		}
    87  	case "volumes-names":
    88  		for _, fields := range cmd.API.Cache.Volumes {
    89  			elements = append(elements, wordifyName(fields[api.CacheTitle], "volume"))
    90  		}
    91  	case "snapshots-all":
    92  		for identifier, fields := range cmd.API.Cache.Snapshots {
    93  			elements = append(elements, identifier, wordifyName(fields[api.CacheTitle], "snapshot"))
    94  		}
    95  	case "snapshots-names":
    96  		for _, fields := range cmd.API.Cache.Snapshots {
    97  			elements = append(elements, wordifyName(fields[api.CacheTitle], "snapshot"))
    98  		}
    99  	case "bootscripts-all":
   100  		for identifier, fields := range cmd.API.Cache.Bootscripts {
   101  			elements = append(elements, identifier, wordifyName(fields[api.CacheTitle], "bootscript"))
   102  		}
   103  	case "bootscripts-names":
   104  		for _, fields := range cmd.API.Cache.Bootscripts {
   105  			elements = append(elements, wordifyName(fields[api.CacheTitle], "bootscript"))
   106  		}
   107  	default:
   108  		return fmt.Errorf("Unhandled category of completion: %s", category)
   109  	}
   110  
   111  	sort.Strings(elements)
   112  	fmt.Println(strings.Join(utils.RemoveDuplicates(elements), "\n"))
   113  
   114  	return nil
   115  }