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
This commit is part of merge request !284. Comments created here will be created in the context of that merge request.
...@@ -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,51 +128,54 @@ 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 { 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)
if c, ok := c.yangSchemaCompleterMap[id]; ok { case 3:
return c.Complete(d) id, err := uuid.Parse(inputSplit[inputLen-1])
} if err != nil {
dev, err := pndAdapter.GetDevice(id.String()) return devicePrompt(d)
if err != nil { }
return []prompt.Suggest{} if c, ok := c.yangSchemaCompleterMap[id]; ok {
} return c.Complete(d)
sid, err := uuid.Parse(dev[0].GetSbi().GetId()) }
if err != nil { schemaTree, err := getSchemaTreeForDeviceID(id.String())
return []prompt.Suggest{} if err != nil {
} return []prompt.Suggest{}
schemaTree, err := pndAdapter.GetSbiSchemaTree(sid) }
if err != nil { c.yangSchemaCompleterMap[id] = completer.NewYangSchemaCompleter(schemaTree["Device"], true)
return []prompt.Suggest{} if yc, ok := c.yangSchemaCompleterMap[id]; ok {
} c.deviceID = id
c.yangSchemaCompleterMap[id] = completer.NewYangSchemaCompleter(schemaTree["Device"], true) return yc.Complete(d)
if yc, ok := c.yangSchemaCompleterMap[id]; ok { }
c.deviceID = id case 4:
return yc.Complete(d) if d.GetWordBeforeCursor() == "" || d.GetWordAfterCursor() != "" {
}
return []prompt.Suggest{} return []prompt.Suggest{}
} }
if inputLen == 2 || (inputLen == 3 && !(d.GetWordBeforeCursor() == "")) { _, err := uuid.Parse(inputSplit[inputLen-2])
spinner, _ := pterm.DefaultSpinner.Start("Requesting devices from controller.") if err != nil {
devices, err := getDevices() return devicePrompt(d)
if err != nil {
spinner.Fail(err)
return prompt.FilterHasPrefix(devices, d.GetWordBeforeCursor(), true)
}
spinner.Success()
return prompt.FilterHasPrefix(devices, d.GetWordBeforeCursor(), true)
} }
} else {
if yc, ok := c.yangSchemaCompleterMap[c.deviceID]; ok { if yc, ok := c.yangSchemaCompleterMap[c.deviceID]; ok {
return yc.Complete(d) return yc.Complete(d)
} }
default:
return []prompt.Suggest{} return []prompt.Suggest{}
} }
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 { func cobraCommandCompletion(currCmd *cobra.Command, d prompt.Document, inputFlags []string, loaded []prompt.Suggest) []prompt.Suggest {
if currCmd.HasAvailableFlags() { if currCmd.HasAvailableFlags() {
currCmd.LocalFlags().VisitAll( currCmd.LocalFlags().VisitAll(
......
...@@ -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 register or to comment