commit fbea22f67861e99b19572bef9929b57e41d530c7
parent 71f259fc28ec722c35b9a8f1f0c52164268b5e86
Author: Sean Enck <sean@ttypty.com>
Date: Thu, 30 Mar 2023 21:24:46 -0400
json should be a filter operation
Diffstat:
6 files changed, 26 insertions(+), 36 deletions(-)
diff --git a/internal/app/conv.go b/internal/app/conv.go
@@ -22,21 +22,28 @@ func Conv(cmd CommandOptions) error {
if err != nil {
return err
}
- if err := serialize(w, t); err != nil {
+ if err := serialize(w, t, ""); err != nil {
return err
}
}
return nil
}
-func serialize(w io.Writer, tx *backend.Transaction) error {
+func serialize(w io.Writer, tx *backend.Transaction, filter string) error {
e, err := tx.QueryCallback(backend.QueryOptions{Mode: backend.ListMode, Values: backend.JSONValue})
if err != nil {
return err
}
fmt.Fprint(w, "{\n")
- for idx, item := range e {
- if idx > 0 {
+ hasFilter := len(filter) > 0
+ printed := false
+ for _, item := range e {
+ if hasFilter {
+ if !strings.HasPrefix(item.Path, filter) {
+ continue
+ }
+ }
+ if printed {
fmt.Fprintf(w, ",\n")
}
b, err := json.MarshalIndent(map[string]json.RawMessage{item.Path: json.RawMessage([]byte(item.Value))}, "", " ")
@@ -47,6 +54,7 @@ func serialize(w io.Writer, tx *backend.Transaction) error {
trimmed = strings.TrimPrefix(trimmed, "{")
trimmed = strings.TrimSuffix(trimmed, "}")
fmt.Fprintf(w, " %s", strings.TrimSpace(trimmed))
+ printed = true
}
fmt.Fprintf(w, "\n}\n")
return nil
diff --git a/internal/app/json.go b/internal/app/json.go
@@ -2,12 +2,7 @@
package app
import (
- "bytes"
- "encoding/json"
"errors"
- "fmt"
-
- "github.com/enckse/lockbox/internal/backend"
)
// JSON will get entries (1 or ALL) in JSON format
@@ -16,20 +11,9 @@ func JSON(cmd CommandOptions) error {
if len(args) > 1 {
return errors.New("invalid arguments")
}
- if len(args) == 0 {
- return serialize(cmd.Writer(), cmd.Transaction())
- }
- entry := args[0]
- v, err := cmd.Transaction().Get(entry, backend.JSONValue)
- if err != nil {
- return fmt.Errorf("unable to get json: %w", err)
- }
- if v != nil {
- var buf bytes.Buffer
- if err := json.Indent(&buf, []byte(v.Value), "", " "); err != nil {
- return err
- }
- fmt.Fprintln(cmd.Writer(), buf.String())
+ filter := ""
+ if len(args) == 1 {
+ filter = args[0]
}
- return nil
+ return serialize(cmd.Writer(), cmd.Transaction(), filter)
}
diff --git a/internal/app/json_test.go b/internal/app/json_test.go
@@ -28,7 +28,7 @@ func TestJSON(t *testing.T) {
if err := app.JSON(m); err != nil {
t.Errorf("invalid error: %v", err)
}
- if m.buf.String() != "" {
+ if m.buf.String() == "" {
t.Error("no data")
}
}
diff --git a/internal/app/rekey_test.go b/internal/app/rekey_test.go
@@ -3,7 +3,6 @@ package app_test
import (
"bytes"
"errors"
- "fmt"
"os"
"testing"
@@ -15,7 +14,7 @@ type (
mockKeyer struct {
data map[string][]byte
err error
- rekeys []app.ReKeyEntry
+ rekeys int
items map[string]backend.JSON
}
)
@@ -36,7 +35,7 @@ func (m *mockKeyer) Show(entry string) ([]byte, error) {
}
func (m *mockKeyer) Insert(entry app.ReKeyEntry) error {
- m.rekeys = append(m.rekeys, entry)
+ m.rekeys++
if entry.Path == "error" {
return errors.New("bad insert")
}
@@ -97,10 +96,7 @@ func TestReKey(t *testing.T) {
if buf.String() == "" {
t.Error("invalid data")
}
- if len(m.rekeys) != 2 {
- t.Error("invalid rekeys")
- }
- if fmt.Sprintf("%v", m.rekeys) != `[{test1 [LOCKBOX_KEYMODE= LOCKBOX_KEY=abc LOCKBOX_KEYFILE= LOCKBOX_STORE=store LOCKBOX_SET_MODTIME=1] [1]} {test2 [LOCKBOX_KEYMODE= LOCKBOX_KEY=abc LOCKBOX_KEYFILE= LOCKBOX_STORE=store LOCKBOX_SET_MODTIME=2] [2]}]` {
- t.Errorf("invalid results: %v", m.rekeys)
+ if m.rekeys != 2 {
+ t.Errorf("invalid results")
}
}
diff --git a/internal/cli/core.go b/internal/cli/core.go
@@ -213,7 +213,7 @@ func Usage(verbose bool) ([]string, error) {
results = append(results, command(HelpCommand, "", "show this usage information"))
results = append(results, subCommand(HelpCommand, HelpAdvancedCommand, "", "display verbose help information"))
results = append(results, command(InsertCommand, "entry", "insert a new entry into the store"))
- results = append(results, command(JSONCommand, "", "display detailed information"))
+ results = append(results, command(JSONCommand, "filter", "display detailed information"))
results = append(results, command(ListCommand, "", "list entries"))
results = append(results, command(MoveCommand, "src dst", "move an entry from source to destination"))
results = append(results, command(MultiLineCommand, "entry", "insert a multiline entry into the store"))
diff --git a/tests/expected.log b/tests/expected.log
@@ -31,8 +31,10 @@ test2
test3
test4
{
- "modtime": "XXXX-XX-XX",
- "hash": "132ab0244293c495a027cec12d0050598616daca888449920fc652719be0987830827d069ef78cc613e348de37c9b592d3406e2fb8d99a6961bf0c58da8a334f"
+ "keys2/k/three": {
+ "modtime": "XXXX-XX-XX",
+ "hash": "132ab0244293c495a027cec12d0050598616daca888449920fc652719be0987830827d069ef78cc613e348de37c9b592d3406e2fb8d99a6961bf0c58da8a334f"
+ }
}
test/k