]> git.giacomolli.uk - onechat/blobdiff - tree.go
Pass caller contexts through WhatsApp callbacks
[onechat] / tree.go
diff --git a/tree.go b/tree.go
index af164aed859ac7f64784c60d4c301314aab27b7f..079969c26b6669329f28c4086b07695b1463d341 100644 (file)
--- a/tree.go
+++ b/tree.go
@@ -55,11 +55,11 @@ func leafSource(message Message) string {
        return message.Kind + ": " + message.Text
 }
 
        return message.Kind + ": " + message.Text
 }
 
-// freeLeaf returns the leaf of message when its source fits in a node. Such a
-// leaf holds the source word for word and needs no model call.
+// freeLeaf returns a text-only leaf when its source fits in a node. Images need
+// a model description even when their text fits.
 func freeLeaf(message Message) (Node, bool) {
        text := leafSource(message)
 func freeLeaf(message Message) (Node, bool) {
        text := leafSource(message)
-       if len(text) > nodeBytes {
+       if len(text) > nodeBytes || len(imageFiles(message.Text)) > 0 {
                return Node{}, false
        }
 
                return Node{}, false
        }
 
@@ -124,6 +124,7 @@ func (t *Tree) Close() error {
 
        for level, index := range t.levels {
                err = errors.Join(err, index.Close())
 
        for level, index := range t.levels {
                err = errors.Join(err, index.Close())
+
                delete(t.levels, level)
        }
 
                delete(t.levels, level)
        }
 
@@ -178,6 +179,7 @@ func (t *Tree) Node(level, index int) (Node, bool, error) {
        }
 
        var node Node
        }
 
        var node Node
+
        err = json.Unmarshal(line, &node)
        if err != nil {
                return Node{}, false, fmt.Errorf("decode node (%d, %d): %w", level, index, err)
        err = json.Unmarshal(line, &node)
        if err != nil {
                return Node{}, false, fmt.Errorf("decode node (%d, %d): %w", level, index, err)
@@ -212,6 +214,7 @@ func (t *Tree) Keys() ([]NodeKey, error) {
 
 func (t *Tree) open(ctx context.Context, total int) error {
        var err error
 
 func (t *Tree) open(ctx context.Context, total int) error {
        var err error
+
        t.order, err = openRecords(filepath.Join(t.dir, "tree.idx"), treeRecordBytes)
        if err != nil {
                return err
        t.order, err = openRecords(filepath.Join(t.dir, "tree.idx"), treeRecordBytes)
        if err != nil {
                return err
@@ -245,9 +248,10 @@ func (t *Tree) open(ctx context.Context, total int) error {
 
        return t.journal.Scan(ctx, start, func(line []byte, place Position) error {
                var node Node
 
        return t.journal.Scan(ctx, start, func(line []byte, place Position) error {
                var node Node
+
                err := json.Unmarshal(line, &node)
                if err != nil {
                err := json.Unmarshal(line, &node)
                if err != nil {
-                       return err
+                       return fmt.Errorf("decode tree node: %w", err)
                }
 
                err = t.check(node)
                }
 
                err = t.check(node)