commit d33857c053a5fc13a60cb0127d64ead2a281834d
parent af6dc8e4f4c9860d6245875a43dfc9bd0f9c74e2
Author: Sean Enck <sean@ttypty.com>
Date: Thu, 2 Mar 2023 19:15:42 -0500
move info out of app
Diffstat:
3 files changed, 197 insertions(+), 83 deletions(-)
diff --git a/internal/app/core.go b/internal/app/core.go
@@ -12,6 +12,7 @@ import (
"github.com/enckse/lockbox/internal/backend"
"github.com/enckse/lockbox/internal/cli"
+ "github.com/enckse/lockbox/internal/commands"
"github.com/enckse/lockbox/internal/inputs"
"github.com/enckse/lockbox/internal/platform"
"github.com/enckse/lockbox/internal/totp"
@@ -21,80 +22,26 @@ import (
//go:embed "vers.txt"
var version string
-type (
- callbackFunction func([]string) error
-)
-
-func internalCallback(name string) callbackFunction {
- switch name {
- case cli.TOTPCommand:
- return totp.Call
- case cli.HashCommand:
- return hashText
- case cli.ClearCommand:
- return clearClipboard
- }
- return nil
-}
-
-func getInfoDefault(args []string, possibleArg string) (bool, error) {
- defaults := false
- invalid := false
- switch len(args) {
- case 2:
- break
- case 3:
- if args[2] == possibleArg {
- defaults = true
- } else {
- invalid = true
- }
- default:
- invalid = true
+func handleEarly(command string, args []string) (bool, error) {
+ ok, err := commands.Info(os.Stdout, command, args)
+ if err != nil {
+ return false, err
}
- if invalid {
- return false, errors.New("invalid argument")
+ if ok {
+ return true, nil
}
- return defaults, nil
-}
-
-func processInfoCommands(command string, args []string) ([]string, error) {
switch command {
- case cli.HelpCommand:
- if len(args) > 3 {
- return nil, errors.New("invalid help command")
- }
- isAdvanced := false
- if len(args) == 3 {
- if args[2] == cli.HelpAdvancedCommand {
- isAdvanced = true
- } else {
- return nil, errors.New("invalid help option")
- }
- }
- results, err := cli.Usage(isAdvanced)
- if err != nil {
- return nil, err
- }
- return results, nil
case cli.VersionCommand:
- return []string{fmt.Sprintf("version: %s", version)}, nil
- case cli.EnvCommand, cli.BashCommand:
- defaultFlag := cli.BashDefaultsCommand
- isEnv := command == cli.EnvCommand
- if isEnv {
- defaultFlag = cli.EnvDefaultsCommand
- }
- defaults, err := getInfoDefault(args, defaultFlag)
- if err != nil {
- return nil, err
- }
- if isEnv {
- return inputs.ListEnvironmentVariables(!defaults), nil
- }
- return cli.BashCompletions(defaults)
+ fmt.Printf("version: %s\n", version)
+ return true, nil
+ case cli.TOTPCommand:
+ return true, totp.Call(args)
+ case cli.HashCommand:
+ return true, hashText(args)
+ case cli.ClearCommand:
+ return true, clearClipboard(args)
}
- return nil, nil
+ return false, nil
}
func wrapped(message string, err error) error {
@@ -108,12 +55,11 @@ func Run() error {
return errors.New("requires subcommand")
}
command := args[1]
- info, err := processInfoCommands(command, args)
+ ok, err := handleEarly(command, args[2:])
if err != nil {
return err
}
- if info != nil {
- fmt.Println(strings.Join(info, "\n"))
+ if ok {
return nil
}
t, err := backend.NewTransaction()
@@ -291,17 +237,6 @@ func Run() error {
return wrapped("clipboard operation failed", err)
}
default:
- if len(args) < 2 {
- return errors.New("missing required arguments")
- }
- a := args[2:]
- callback := internalCallback(command)
- if callback != nil {
- if err := callback(a); err != nil {
- return wrapped(fmt.Sprintf("%s command failure", command), err)
- }
- return nil
- }
return fmt.Errorf("unknown command: %s", command)
}
return nil
diff --git a/internal/commands/info.go b/internal/commands/info.go
@@ -0,0 +1,83 @@
+// Package commands handles informational requests
+package commands
+
+import (
+ "errors"
+ "fmt"
+ "io"
+ "strings"
+
+ "github.com/enckse/lockbox/internal/cli"
+ "github.com/enckse/lockbox/internal/inputs"
+)
+
+// Info will report help/bash/env details
+func Info(w io.Writer, command string, args []string) (bool, error) {
+ i, err := info(command, args)
+ if err != nil {
+ return false, err
+ }
+ if len(i) > 0 {
+ fmt.Fprintf(w, "%s\n", strings.Join(i, "\n"))
+ return true, nil
+ }
+ return false, nil
+}
+
+func info(command string, args []string) ([]string, error) {
+ switch command {
+ case cli.HelpCommand:
+ if len(args) > 1 {
+ return nil, errors.New("invalid help command")
+ }
+ isAdvanced := false
+ if len(args) == 1 {
+ if args[0] == cli.HelpAdvancedCommand {
+ isAdvanced = true
+ } else {
+ return nil, errors.New("invalid help option")
+ }
+ }
+ results, err := cli.Usage(isAdvanced)
+ if err != nil {
+ return nil, err
+ }
+ return results, nil
+ case cli.EnvCommand, cli.BashCommand:
+ defaultFlag := cli.BashDefaultsCommand
+ isEnv := command == cli.EnvCommand
+ if isEnv {
+ defaultFlag = cli.EnvDefaultsCommand
+ }
+ defaults, err := getInfoDefault(args, defaultFlag)
+ if err != nil {
+ return nil, err
+ }
+ if isEnv {
+ return inputs.ListEnvironmentVariables(!defaults), nil
+ }
+ return cli.BashCompletions(defaults)
+ }
+ return nil, nil
+}
+
+func getInfoDefault(args []string, possibleArg string) (bool, error) {
+ defaults := false
+ invalid := false
+ switch len(args) {
+ case 0:
+ break
+ case 1:
+ if args[0] == possibleArg {
+ defaults = true
+ } else {
+ invalid = true
+ }
+ default:
+ invalid = true
+ }
+ if invalid {
+ return false, errors.New("invalid argument")
+ }
+ return defaults, nil
+}
diff --git a/internal/commands/info_test.go b/internal/commands/info_test.go
@@ -0,0 +1,96 @@
+package commands_test
+
+import (
+ "bytes"
+ "os"
+ "testing"
+
+ "github.com/enckse/lockbox/internal/commands"
+)
+
+func TestNoInfo(t *testing.T) {
+ var buf bytes.Buffer
+ ok, err := commands.Info(&buf, "", []string{})
+ if ok || err != nil {
+ t.Errorf("invalid error: %v", err)
+ }
+}
+
+func TestHelpInfo(t *testing.T) {
+ os.Clearenv()
+ var buf bytes.Buffer
+ ok, err := commands.Info(&buf, "help", []string{})
+ if !ok || err != nil {
+ t.Errorf("invalid error: %v", err)
+ }
+ if buf.String() == "" {
+ t.Error("nothing written")
+ }
+ old := buf.String()
+ buf = bytes.Buffer{}
+ ok, err = commands.Info(&buf, "help", []string{"-verbose"})
+ if !ok || err != nil {
+ t.Errorf("invalid error: %v", err)
+ }
+ if buf.String() == "" || old == buf.String() {
+ t.Error("nothing written")
+ }
+ if _, err = commands.Info(&buf, "help", []string{"-verb"}); err.Error() != "invalid help option" {
+ t.Errorf("invalid error: %v", err)
+ }
+ if _, err = commands.Info(&buf, "help", []string{"-verbose", "A"}); err.Error() != "invalid help command" {
+ t.Errorf("invalid error: %v", err)
+ }
+}
+
+func TestBashInfo(t *testing.T) {
+ os.Clearenv()
+ var buf bytes.Buffer
+ ok, err := commands.Info(&buf, "bash", []string{})
+ if !ok || err != nil {
+ t.Errorf("invalid error: %v", err)
+ }
+ if buf.String() == "" {
+ t.Error("nothing written")
+ }
+ buf = bytes.Buffer{}
+ ok, err = commands.Info(&buf, "bash", []string{"-defaults"})
+ if !ok || err != nil {
+ t.Errorf("invalid error: %v", err)
+ }
+ if buf.String() == "" {
+ t.Error("nothing written")
+ }
+ if _, err = commands.Info(&buf, "bash", []string{"-default"}); err.Error() != "invalid argument" {
+ t.Errorf("invalid error: %v", err)
+ }
+ if _, err = commands.Info(&buf, "bash", []string{"test", "-default"}); err.Error() != "invalid argument" {
+ t.Errorf("invalid error: %v", err)
+ }
+}
+
+func TestEnvInfo(t *testing.T) {
+ os.Clearenv()
+ var buf bytes.Buffer
+ ok, err := commands.Info(&buf, "env", []string{})
+ if !ok || err != nil {
+ t.Errorf("invalid error: %v", err)
+ }
+ if buf.String() == "" {
+ t.Error("nothing written")
+ }
+ buf = bytes.Buffer{}
+ ok, err = commands.Info(&buf, "env", []string{"-defaults"})
+ if !ok || err != nil {
+ t.Errorf("invalid error: %v", err)
+ }
+ if buf.String() == "" {
+ t.Error("nothing written")
+ }
+ if _, err = commands.Info(&buf, "env", []string{"-default"}); err.Error() != "invalid argument" {
+ t.Errorf("invalid error: %v", err)
+ }
+ if _, err = commands.Info(&buf, "env", []string{"test", "-default"}); err.Error() != "invalid argument" {
+ t.Errorf("invalid error: %v", err)
+ }
+}