This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack-cloudmonkey.git


The following commit(s) were added to refs/heads/master by this push:
     new 3584ac0  set: autocompletion for set parameters
3584ac0 is described below

commit 3584ac03f6899c7debd218f54351f70429983f11
Author: Rohit Yadav <ro...@apache.org>
AuthorDate: Sat Apr 14 06:44:25 2018 +0530

    set: autocompletion for set parameters
    
    Signed-off-by: Rohit Yadav <ro...@apache.org>
---
 cli/completer.go | 31 +++++++++++++++++++++----------
 cli/shell.go     |  1 +
 cmd/api.go       |  2 +-
 cmd/command.go   |  2 +-
 cmd/set.go       | 20 ++++++++++++++++----
 config/cache.go  |  2 +-
 config/config.go | 17 +++++++++++++++++
 7 files changed, 58 insertions(+), 17 deletions(-)

diff --git a/cli/completer.go b/cli/completer.go
index 271faa1..8ade3f6 100644
--- a/cli/completer.go
+++ b/cli/completer.go
@@ -37,12 +37,23 @@ func buildAPICacheMap(apiMap map[string][]*config.API) 
map[string][]*config.API
        for _, cmd := range cmd.AllCommands() {
                verb := cmd.Name
                if cmd.SubCommands != nil && len(cmd.SubCommands) > 0 {
-                       for _, scmd := range cmd.SubCommands {
-                               dummyAPI := &config.API{
-                                       Name: scmd,
-                                       Verb: verb,
+                       for command, opts := range cmd.SubCommands {
+                               var args []*config.APIArg
+                               options := opts
+                               if command == "profile" {
+                                       options = config.GetProfiles()
+                               }
+                               for _, opt := range options {
+                                       args = append(args, &config.APIArg{
+                                               Name: opt,
+                                       })
                                }
-                               apiMap[verb] = append(apiMap[verb], dummyAPI)
+                               apiMap[verb] = append(apiMap[verb], &config.API{
+                                       Name: command,
+                                       Verb: verb,
+                                       Noun: command,
+                                       Args: args,
+                               })
                        }
                } else {
                        dummyAPI := &config.API{
@@ -151,7 +162,7 @@ func (t *autoCompleter) Do(line []rune, pos int) (options 
[][]rune, offset int)
        splitLine := strings.Split(string(line), " ")
        line = trimSpaceLeft([]rune(splitLine[len(splitLine)-1]))
        for _, arg := range apiFound.Args {
-               search := arg.Name + "="
+               search := arg.Name
                if !runes.HasPrefix(line, []rune(search)) {
                        sLine, sOffset := doInternal(line, pos, len(line), 
[]rune(search))
                        options = append(options, sLine...)
@@ -165,15 +176,15 @@ func (t *autoCompleter) Do(line []rune, pos int) (options 
[][]rune, offset int)
 
                        var autocompleteAPI *config.API
                        var relatedNoun string
-                       if arg.Name == "id" || arg.Name == "ids" {
+                       if arg.Name == "id=" || arg.Name == "ids=" {
                                relatedNoun = apiFound.Noun
                                if apiFound.Verb != "list" {
                                        relatedNoun += "s"
                                }
-                       } else if arg.Name == "account" {
+                       } else if arg.Name == "account=" {
                                relatedNoun = "accounts"
                        } else {
-                               relatedNoun = 
strings.Replace(strings.Replace(arg.Name, "ids", "", -1), "id", "", -1) + "s"
+                               relatedNoun = 
strings.Replace(strings.Replace(arg.Name, "ids=", "", -1), "id=", "", -1) + "s"
                        }
                        for _, related := range apiMap["list"] {
                                if relatedNoun == related.Noun {
@@ -231,7 +242,7 @@ func (t *autoCompleter) Do(line []rune, pos int) (options 
[][]rune, offset int)
                                })
                                fmt.Println()
                                selectedOption := 
showSelector(autocompleteOptions)
-                               if strings.HasSuffix(arg.Name, "id") || 
strings.HasSuffix(arg.Name, "ids") {
+                               if strings.HasSuffix(arg.Name, "id=") || 
strings.HasSuffix(arg.Name, "ids=") {
                                        selected = selectedOption.ID
                                } else {
                                        selected = selectedOption.Name
diff --git a/cli/shell.go b/cli/shell.go
index 26ab8d9..cdf46ac 100644
--- a/cli/shell.go
+++ b/cli/shell.go
@@ -23,6 +23,7 @@ import (
        "strings"
 
        "cloudmonkey/config"
+
        "github.com/mattn/go-shellwords"
 
        "github.com/chzyer/readline"
diff --git a/cmd/api.go b/cmd/api.go
index facb25a..dd4400a 100644
--- a/cmd/api.go
+++ b/cmd/api.go
@@ -63,7 +63,7 @@ func init() {
                        for _, required := range api.RequiredArgs {
                                provided := false
                                for _, arg := range apiArgs {
-                                       if strings.HasPrefix(arg, required+"=") 
{
+                                       if strings.HasPrefix(arg, required) {
                                                provided = true
                                        }
                                }
diff --git a/cmd/command.go b/cmd/command.go
index 4f90387..7d5a2fe 100644
--- a/cmd/command.go
+++ b/cmd/command.go
@@ -25,7 +25,7 @@ import (
 type Command struct {
        Name            string
        Help            string
-       SubCommands     []string
+       SubCommands     map[string][]string
        CustomCompleter func(input string, position int)
        Handle          func(*Request) error
 }
diff --git a/cmd/set.go b/cmd/set.go
index a40e5ba..5c66f1b 100644
--- a/cmd/set.go
+++ b/cmd/set.go
@@ -24,12 +24,24 @@ import (
 
 func init() {
        AddCommand(&Command{
-               Name:        "set",
-               Help:        "Configures options for cmk",
-               SubCommands: []string{"block", "output", "profile"},
+               Name: "set",
+               Help: "Configures options for cmk",
+               SubCommands: map[string][]string{
+                       "asyncblock": {"true", "false"},
+                       "timeout":    {"600", "1800", "3600"},
+                       "output":     {"json", "text", "table", "xml"},
+                       "profile":    {},
+                       "url":        {},
+                       "username":   {},
+                       "password":   {},
+                       "domain":     {},
+                       "apikey":     {},
+                       "secretkey":  {},
+                       "verifycert": {"true", "false"},
+               },
                Handle: func(r *Request) error {
                        if len(r.Args) < 1 {
-                               fmt.Println("Please select one of the 
sub-commands: ", strings.Join(r.Command.SubCommands, ", "))
+                               fmt.Println("Please provide one of the 
sub-commands: ", r.Command.SubCommands)
                                return nil
                        }
                        subCommand := r.Args[0]
diff --git a/config/cache.go b/config/cache.go
index 002ddf3..a037a95 100644
--- a/config/cache.go
+++ b/config/cache.go
@@ -130,7 +130,7 @@ func (c *Config) UpdateCache(response 
map[string]interface{}) interface{} {
                                sort.Strings(related)
                        }
                        apiArgs = append(apiArgs, &APIArg{
-                               Name:        apiArg["name"].(string),
+                               Name:        apiArg["name"].(string) + "=",
                                Type:        apiArg["type"].(string),
                                Required:    apiArg["required"].(bool),
                                Related:     related,
diff --git a/config/config.go b/config/config.go
index df6d4c1..16b2b64 100644
--- a/config/config.go
+++ b/config/config.go
@@ -99,6 +99,13 @@ func defaultConfig() *Config {
        }
 }
 
+var profiles []string
+
+// GetProfiles returns list of available profiles
+func GetProfiles() []string {
+       return profiles
+}
+
 func reloadConfig(cfg *Config) *Config {
 
        if _, err := os.Stat(cfg.Dir); err != nil {
@@ -155,6 +162,16 @@ func reloadConfig(cfg *Config) *Config {
        }
        // Save
        conf.SaveTo(cfg.ConfigFile)
+
+       // Update available profiles list
+       profiles = []string{}
+       for _, profile := range conf.Sections() {
+               if profile.Name() == ini.DEFAULT_SECTION {
+                       continue
+               }
+               profiles = append(profiles, profile.Name())
+       }
+
        return cfg
 }
 

-- 
To stop receiving notification emails like this one, please contact
ro...@apache.org.

Reply via email to