Skip to content
Snippets Groups Projects
Commit aab38fc2 authored by Malte Bauch's avatar Malte Bauch
Browse files

Set/Get in `prompt` mode is now working properly when moving the cursor

parent 489f63b3
No related branches found
No related tags found
1 merge request!284Improve usability and better output formatting for gosndc
Pipeline #99200 failed
...@@ -47,7 +47,7 @@ import ( ...@@ -47,7 +47,7 @@ import (
// PromptCompleter provides completion for a device // PromptCompleter provides completion for a device
type PromptCompleter struct { type PromptCompleter struct {
//NOTE: not too sure about this but for now it should be sufficient //NOTE: should be removed
deviceID uuid.UUID deviceID uuid.UUID
yangSchemaCompleterMap map[uuid.UUID]*completer.YangSchemaCompleter yangSchemaCompleterMap map[uuid.UUID]*completer.YangSchemaCompleter
} }
...@@ -113,7 +113,7 @@ func (pc *PromptCompleter) cstmCompleter(d prompt.Document) []prompt.Suggest { ...@@ -113,7 +113,7 @@ func (pc *PromptCompleter) cstmCompleter(d prompt.Document) []prompt.Suggest {
currCmd = c currCmd = c
} }
return completionBasedOnCmd(pc, currCmd, inputSplit, inputFlags, d) return completionBasedOnCmd(pc, currCmd, inputSplitFiltered, inputFlags, d)
} }
func filterFlagSlice(input []string) (commandSlice []string, flagSlice []string) { func filterFlagSlice(input []string) (commandSlice []string, flagSlice []string) {
...@@ -128,33 +128,44 @@ func filterFlagSlice(input []string) (commandSlice []string, flagSlice []string) ...@@ -128,33 +128,44 @@ func filterFlagSlice(input []string) (commandSlice []string, flagSlice []string)
} }
func deviceGetCompletion(c *PromptCompleter, d prompt.Document, inputSplit []string) []prompt.Suggest { func deviceGetCompletion(c *PromptCompleter, d prompt.Document, inputSplit []string) []prompt.Suggest {
inputLen := len(inputSplit) switch inputLen := len(inputSplit); inputLen {
if inputLen == 2 || inputLen == 3 { case 2:
if id, err := uuid.Parse(inputSplit[inputLen-1]); err == nil { return devicePrompt(d)
case 3:
id, err := uuid.Parse(inputSplit[inputLen-1])
if err != nil {
return devicePrompt(d)
}
if c, ok := c.yangSchemaCompleterMap[id]; ok { if c, ok := c.yangSchemaCompleterMap[id]; ok {
return c.Complete(d) return c.Complete(d)
} }
dev, err := pndAdapter.GetDevice(id.String()) schemaTree, err := getSchemaTreeForDeviceID(id.String())
if err != nil { if err != nil {
return []prompt.Suggest{} return []prompt.Suggest{}
} }
sid, err := uuid.Parse(dev[0].GetSbi().GetId()) c.yangSchemaCompleterMap[id] = completer.NewYangSchemaCompleter(schemaTree["Device"], true)
if err != nil { if yc, ok := c.yangSchemaCompleterMap[id]; ok {
c.deviceID = id
return yc.Complete(d)
}
case 4:
if d.GetWordBeforeCursor() == "" || d.GetWordAfterCursor() != "" {
return []prompt.Suggest{} return []prompt.Suggest{}
} }
schemaTree, err := pndAdapter.GetSbiSchemaTree(sid) _, err := uuid.Parse(inputSplit[inputLen-2])
if err != nil { if err != nil {
return []prompt.Suggest{} return devicePrompt(d)
} }
c.yangSchemaCompleterMap[id] = completer.NewYangSchemaCompleter(schemaTree["Device"], true) if yc, ok := c.yangSchemaCompleterMap[c.deviceID]; ok {
if yc, ok := c.yangSchemaCompleterMap[id]; ok {
c.deviceID = id
return yc.Complete(d) return yc.Complete(d)
} }
default:
return []prompt.Suggest{}
}
return []prompt.Suggest{} return []prompt.Suggest{}
} }
if inputLen == 2 || (inputLen == 3 && !(d.GetWordBeforeCursor() == "")) {
func devicePrompt(d prompt.Document) []prompt.Suggest {
spinner, _ := pterm.DefaultSpinner.Start("Requesting devices from controller.") spinner, _ := pterm.DefaultSpinner.Start("Requesting devices from controller.")
devices, err := getDevices() devices, err := getDevices()
if err != nil { if err != nil {
...@@ -164,14 +175,6 @@ func deviceGetCompletion(c *PromptCompleter, d prompt.Document, inputSplit []str ...@@ -164,14 +175,6 @@ func deviceGetCompletion(c *PromptCompleter, d prompt.Document, inputSplit []str
spinner.Success() spinner.Success()
return prompt.FilterHasPrefix(devices, d.GetWordBeforeCursor(), true) return prompt.FilterHasPrefix(devices, d.GetWordBeforeCursor(), true)
} }
} else {
if yc, ok := c.yangSchemaCompleterMap[c.deviceID]; ok {
return yc.Complete(d)
}
return []prompt.Suggest{}
}
return []prompt.Suggest{}
}
func cobraCommandCompletion(currCmd *cobra.Command, d prompt.Document, inputFlags []string, loaded []prompt.Suggest) []prompt.Suggest { func cobraCommandCompletion(currCmd *cobra.Command, d prompt.Document, inputFlags []string, loaded []prompt.Suggest) []prompt.Suggest {
if currCmd.HasAvailableFlags() { if currCmd.HasAvailableFlags() {
......
...@@ -39,6 +39,8 @@ import ( ...@@ -39,6 +39,8 @@ import (
"code.fbi.h-da.de/danet/gosdn/cli/completer" "code.fbi.h-da.de/danet/gosdn/cli/completer"
"code.fbi.h-da.de/danet/gosdn/controller/api" "code.fbi.h-da.de/danet/gosdn/controller/api"
"github.com/c-bata/go-prompt" "github.com/c-bata/go-prompt"
"github.com/google/uuid"
"github.com/openconfig/goyang/pkg/yang"
"github.com/spf13/viper" "github.com/spf13/viper"
) )
...@@ -69,6 +71,18 @@ func getDevices() ([]prompt.Suggest, error) { ...@@ -69,6 +71,18 @@ func getDevices() ([]prompt.Suggest, error) {
return completer.SortSuggestionByText(s), nil return completer.SortSuggestionByText(s), nil
} }
func getSchemaTreeForDeviceID(id string) (map[string]*yang.Entry, error) {
dev, err := pndAdapter.GetDevice(id)
if err != nil {
return nil, err
}
sid, err := uuid.Parse(dev[0].GetSbi().GetId())
if err != nil {
return nil, err
}
return pndAdapter.GetSbiSchemaTree(sid)
}
func getPnds() []prompt.Suggest { func getPnds() []prompt.Suggest {
resp, err := api.GetIds(viper.GetString("controllerAPIEndpoint")) resp, err := api.GetIds(viper.GetString("controllerAPIEndpoint"))
if err != nil { if err != nil {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment