diff --git a/sp/commands/root.go b/sp/commands/root.go index 7f31fb5..5d5f0ec 100644 --- a/sp/commands/root.go +++ b/sp/commands/root.go @@ -2,7 +2,11 @@ package commands import ( "context" + "fmt" + "os" + "strings" + "github.com/c-bata/go-prompt" "github.com/spf13/cobra" credrepos "github.com/mitchell/selfpass/services/credentials/repositories" @@ -15,6 +19,7 @@ import ( func Execute() { rootCmd := &cobra.Command{ Use: "sp", + Run: run, Short: "This is the CLI client for Selfpass.", Long: `This is the CLI client for Selfpass, the self-hosted password manager. With this tool you can interact with the entire Selfpass API.`, @@ -42,6 +47,50 @@ can interact with the entire Selfpass API.`, check(rootCmd.Execute()) } +func run(cmd *cobra.Command, _ []string) { + ss := []prompt.Suggest{ + {Text: "exit", Description: "Exit selfpass prompt"}, + } + + for _, subcmd := range cmd.Commands() { + ss = append(ss, prompt.Suggest{ + Text: subcmd.Name(), + Description: subcmd.Short, + }) + } + + completer := func(d prompt.Document) []prompt.Suggest { + return prompt.FilterHasPrefix(ss, d.TextBeforeCursor(), true) + } + + executor := func(argstr string) { + args := strings.Split(argstr, " ") + + if len(args) > 0 && args[0] == "exit" { + fmt.Print("Goodbye!\n\n") + os.Exit(0) + } + + cmd.SetArgs(args) + err := cmd.Execute() + if err != nil { + fmt.Println(err) + } + fmt.Println() + } + + p := prompt.New( + executor, + completer, + prompt.OptionPrefix("selfpass-> "), + prompt.OptionPrefixTextColor(prompt.White), + prompt.OptionSuggestionBGColor(prompt.DarkBlue), + prompt.OptionDescriptionBGColor(prompt.Blue), + ) + + p.Run() +} + func makeInitClient(repo types.ConfigRepo, initClient credtypes.CredentialsClientInit) credentialsClientInit { return func(ctx context.Context) credtypes.CredentialsClient { _, cfg, err := repo.OpenConfig() diff --git a/sp/go.mod b/sp/go.mod index 20be702..5c567e1 100644 --- a/sp/go.mod +++ b/sp/go.mod @@ -4,10 +4,12 @@ go 1.12 require ( github.com/atotto/clipboard v0.1.2 + github.com/c-bata/go-prompt v0.2.3 github.com/google/uuid v1.1.1 github.com/mitchell/selfpass/services v0.0.0-00010101000000-000000000000 github.com/mitchellh/go-homedir v1.1.0 github.com/ncw/rclone v1.48.0 + github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942 // indirect github.com/pquerna/otp v1.2.0 github.com/spf13/cobra v0.0.5 github.com/spf13/viper v1.4.0 diff --git a/sp/go.sum b/sp/go.sum index 7c37d01..8b32f60 100644 --- a/sp/go.sum +++ b/sp/go.sum @@ -28,6 +28,8 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/billziss-gh/cgofuse v1.1.0/go.mod h1:LJjoaUojlVjgo5GQoEJTcJNqZJeRU0nCR84CyxKt2YM= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/c-bata/go-prompt v0.2.3 h1:jjCS+QhG/sULBhAaBdjb2PlMRVaKXQgn+4yzaauvs2s= +github.com/c-bata/go-prompt v0.2.3/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -131,6 +133,7 @@ github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRU github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed h1:3dQJqqDouawQgl3gBE1PNHKFkJYGEuFb1DbSlaxdosE= @@ -166,6 +169,8 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1-0.20190523025818-e98a7bef6829/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= +github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942 h1:A7GG7zcGjl3jqAqGPmcNjd/D9hzL95SuoOQAaFNdLU0= +github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok=