-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathipldutil.go
72 lines (62 loc) · 1.96 KB
/
ipldutil.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package ipldutil
import (
"bytes"
"context"
"errors"
ipld "github.com/ipld/go-ipld-prime"
dagpb "github.com/ipld/go-ipld-prime-proto"
"github.com/ipld/go-ipld-prime/encoding/dagcbor"
free "github.com/ipld/go-ipld-prime/impl/free"
"github.com/ipld/go-ipld-prime/traversal"
ipldtraversal "github.com/ipld/go-ipld-prime/traversal"
"github.com/ipld/go-ipld-prime/traversal/selector"
ipldselector "github.com/ipld/go-ipld-prime/traversal/selector"
)
var errDoNotFollow = errors.New("Dont Follow Me")
// ErrDoNotFollow is just a wrapper for whatever IPLD's ErrDoNotFollow ends up looking like
func ErrDoNotFollow() error {
return errDoNotFollow
}
var (
defaultChooser traversal.NodeBuilderChooser = dagpb.AddDagPBSupportToChooser(func(ipld.Link, ipld.LinkContext) (ipld.NodeBuilder, error) {
return free.NodeBuilder(), nil
})
)
func Traverse(ctx context.Context, loader ipld.Loader, chooser traversal.NodeBuilderChooser, root ipld.Link, s selector.Selector, fn traversal.AdvVisitFn) error {
if chooser == nil {
chooser = defaultChooser
}
builder, err := chooser(root, ipld.LinkContext{})
if err != nil {
return err
}
node, err := root.Load(ctx, ipld.LinkContext{}, builder, loader)
if err != nil {
return err
}
return traversal.Progress{
Cfg: &traversal.Config{
Ctx: ctx,
LinkLoader: loader,
LinkNodeBuilderChooser: chooser,
},
}.WalkAdv(node, s, fn)
}
func WalkMatching(node ipld.Node, s selector.Selector, fn traversal.VisitFn) error {
return ipldtraversal.WalkMatching(node, s, fn)
}
func EncodeNode(node ipld.Node) ([]byte, error) {
var buffer bytes.Buffer
err := dagcbor.Encoder(node, &buffer)
if err != nil {
return nil, err
}
return buffer.Bytes(), nil
}
func DecodeNode(encoded []byte) (ipld.Node, error) {
reader := bytes.NewReader(encoded)
return dagcbor.Decoder(free.NodeBuilder(), reader)
}
func ParseSelector(selector ipld.Node) (selector.Selector, error) {
return ipldselector.ParseSelector(selector)
}