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 }