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 (
// PromptCompleter provides completion for a device
type PromptCompleter struct {
//NOTE: not too sure about this but for now it should be sufficient
//NOTE: should be removed
deviceID uuid.UUID
yangSchemaCompleterMap map[uuid.UUID]*completer.YangSchemaCompleter
}
......@@ -113,7 +113,7 @@ func (pc *PromptCompleter) cstmCompleter(d prompt.Document) []prompt.Suggest {
currCmd = c
}
return completionBasedOnCmd(pc, currCmd, inputSplit, inputFlags, d)
return completionBasedOnCmd(pc, currCmd, inputSplitFiltered, inputFlags, d)
}
func filterFlagSlice(input []string) (commandSlice []string, flagSlice []string) {
......@@ -128,51 +128,54 @@ func filterFlagSlice(input []string) (commandSlice []string, flagSlice []string)
}
func deviceGetCompletion(c *PromptCompleter, d prompt.Document, inputSplit []string) []prompt.Suggest {
inputLen := len(inputSplit)
if inputLen == 2 || inputLen == 3 {
if id, err := uuid.Parse(inputSplit[inputLen-1]); err == nil {
if c, ok := c.yangSchemaCompleterMap[id]; ok {
return c.Complete(d)
}
dev, err := pndAdapter.GetDevice(id.String())
if err != nil {
return []prompt.Suggest{}
}
sid, err := uuid.Parse(dev[0].GetSbi().GetId())
if err != nil {
return []prompt.Suggest{}
}
schemaTree, err := pndAdapter.GetSbiSchemaTree(sid)
if err != nil {
return []prompt.Suggest{}
}
c.yangSchemaCompleterMap[id] = completer.NewYangSchemaCompleter(schemaTree["Device"], true)
if yc, ok := c.yangSchemaCompleterMap[id]; ok {
c.deviceID = id
return yc.Complete(d)
}
switch inputLen := len(inputSplit); inputLen {
case 2:
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 {
return c.Complete(d)
}
schemaTree, err := getSchemaTreeForDeviceID(id.String())
if err != nil {
return []prompt.Suggest{}
}
c.yangSchemaCompleterMap[id] = completer.NewYangSchemaCompleter(schemaTree["Device"], true)
if yc, ok := c.yangSchemaCompleterMap[id]; ok {
c.deviceID = id
return yc.Complete(d)
}
case 4:
if d.GetWordBeforeCursor() == "" || d.GetWordAfterCursor() != "" {
return []prompt.Suggest{}
}
if inputLen == 2 || (inputLen == 3 && !(d.GetWordBeforeCursor() == "")) {
spinner, _ := pterm.DefaultSpinner.Start("Requesting devices from controller.")
devices, err := getDevices()
if err != nil {
spinner.Fail(err)
return prompt.FilterHasPrefix(devices, d.GetWordBeforeCursor(), true)
}
spinner.Success()
return prompt.FilterHasPrefix(devices, d.GetWordBeforeCursor(), true)
_, err := uuid.Parse(inputSplit[inputLen-2])
if err != nil {
return devicePrompt(d)
}
} else {
if yc, ok := c.yangSchemaCompleterMap[c.deviceID]; ok {
return yc.Complete(d)
}
default:
return []prompt.Suggest{}
}
return []prompt.Suggest{}
}
func devicePrompt(d prompt.Document) []prompt.Suggest {
spinner, _ := pterm.DefaultSpinner.Start("Requesting devices from controller.")
devices, err := getDevices()
if err != nil {
spinner.Fail(err)
return prompt.FilterHasPrefix(devices, d.GetWordBeforeCursor(), true)
}
spinner.Success()
return prompt.FilterHasPrefix(devices, d.GetWordBeforeCursor(), true)
}
func cobraCommandCompletion(currCmd *cobra.Command, d prompt.Document, inputFlags []string, loaded []prompt.Suggest) []prompt.Suggest {
if currCmd.HasAvailableFlags() {
currCmd.LocalFlags().VisitAll(
......
......@@ -39,6 +39,8 @@ import (
"code.fbi.h-da.de/danet/gosdn/cli/completer"
"code.fbi.h-da.de/danet/gosdn/controller/api"
"github.com/c-bata/go-prompt"
"github.com/google/uuid"
"github.com/openconfig/goyang/pkg/yang"
"github.com/spf13/viper"
)
......@@ -69,6 +71,18 @@ func getDevices() ([]prompt.Suggest, error) {
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 {
resp, err := api.GetIds(viper.GetString("controllerAPIEndpoint"))
if err != nil {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment