lockbox

password manager
Log | Files | Refs | README | LICENSE

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:
Minternal/app/core.go | 101++++++++++++++-----------------------------------------------------------------
Ainternal/commands/info.go | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ainternal/commands/info_test.go | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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) + } +}