lockbox

password manager
Log | Files | Refs | README | LICENSE

commit 75c0b1a8cb647c469040679e4a83650514feabf7
parent b6ebda8d29faa567af5e59f50d398cad77c198d3
Author: Sean Enck <sean@ttypty.com>
Date:   Wed,  4 Jun 2025 22:56:59 -0400

combining these is a bit odd, but they need to follow the same rules

Diffstat:
Minternal/app/core.go | 20++++++++++++++++++++
Minternal/app/list.go | 25++++++++++---------------
Minternal/app/totp.go | 22+++++++---------------
3 files changed, 37 insertions(+), 30 deletions(-)

diff --git a/internal/app/core.go b/internal/app/core.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "os" + "regexp" "git.sr.ht/~enckse/lockbox/internal/backend" "git.sr.ht/~enckse/lockbox/internal/platform" @@ -96,3 +97,22 @@ func (a DefaultCommand) Password() (string, error) { func (a *DefaultCommand) Input(interactive bool) ([]byte, error) { return platform.GetUserInputPassword(interactive) } + +func generatePrinter[T any](w io.Writer, isFilter bool, filter string, toMatch, toDisplay func(T) string) (func(T), error) { + printer := func(p T) { + fmt.Fprintf(w, "%s\n", toDisplay(p)) + } + finder := printer + if isFilter { + re, err := regexp.Compile(filter) + if err != nil { + return nil, err + } + finder = func(p T) { + if re.MatchString(toMatch(p)) { + printer(p) + } + } + } + return finder, nil +} diff --git a/internal/app/list.go b/internal/app/list.go @@ -3,8 +3,6 @@ package app import ( "errors" - "fmt" - "regexp" "git.sr.ht/~enckse/lockbox/internal/backend" ) @@ -28,20 +26,17 @@ func List(cmd CommandOptions, isFind bool) error { return err } w := cmd.Writer() - printer := func(p string) { - fmt.Fprintf(w, "%s\n", p) - } - finder := printer + filter := "" if isFind { - re, err := regexp.Compile(args[0]) - if err != nil { - return err - } - finder = func(p string) { - if re.MatchString(p) { - printer(p) - } - } + filter = args[0] + } + finder, err := generatePrinter(w, isFind, filter, func(p string) string { + return p + }, func(p string) string { + return p + }) + if err != nil { + return err } for f, err := range e { if err != nil { diff --git a/internal/app/totp.go b/internal/app/totp.go @@ -4,7 +4,6 @@ package app import ( "errors" "fmt" - "regexp" "slices" "strconv" "strings" @@ -231,20 +230,13 @@ func (args *TOTPArguments) Do(opts TOTPOptions) error { return err } writer := opts.app.Writer() - printer := func(entity backend.Entity) { - fmt.Fprintf(writer, "%s\n", entity.Directory()) - } - filter := printer - if args.Mode == FindTOTPMode { - re, err := regexp.Compile(args.Entry) - if err != nil { - return err - } - filter = func(entity backend.Entity) { - if re.MatchString(entity.Path) { - printer(entity) - } - } + filter, err := generatePrinter(writer, args.Mode == FindTOTPMode, args.Entry, func(e backend.Entity) string { + return e.Path + }, func(e backend.Entity) string { + return e.Directory() + }) + if err != nil { + return err } for entry, err := range e { if err != nil {