Skip to content

Commit 5bd05cc

Browse files
committed
chore(metadata): convert metadata to bindnode
1 parent e0f5c2b commit 5bd05cc

5 files changed

Lines changed: 45 additions & 178 deletions

File tree

metadata/metadata.go

Lines changed: 11 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@ package metadata
22

33
import (
44
"bytes"
5-
"fmt"
65

76
"github.com/ipfs/go-cid"
8-
cbg "github.com/whyrusleeping/cbor-gen"
9-
xerrors "golang.org/x/xerrors"
7+
"github.com/ipld/go-ipld-prime/codec/dagcbor"
8+
"github.com/ipld/go-ipld-prime/node/bindnode"
109
)
1110

1211
// Item is a single link traversed in a repsonse
@@ -22,56 +21,22 @@ type Metadata []Item
2221
// DecodeMetadata assembles metadata from a raw byte array, first deserializing
2322
// as a node and then assembling into a metadata struct.
2423
func DecodeMetadata(data []byte) (Metadata, error) {
25-
var metadata Metadata
26-
r := bytes.NewReader(data)
27-
28-
br := cbg.GetPeeker(r)
29-
scratch := make([]byte, 8)
30-
31-
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
24+
builder := Prototype.Metadata.Representation().NewBuilder()
25+
err := dagcbor.Decode(builder, bytes.NewReader(data))
3226
if err != nil {
3327
return nil, err
3428
}
35-
36-
if extra > cbg.MaxLength {
37-
return nil, fmt.Errorf("t.Metadata: array too large (%d)", extra)
38-
}
39-
40-
if maj != cbg.MajArray {
41-
return nil, fmt.Errorf("expected cbor array")
42-
}
43-
44-
if extra > 0 {
45-
metadata = make(Metadata, extra)
46-
}
47-
48-
for i := 0; i < int(extra); i++ {
49-
50-
var v Item
51-
if err := v.UnmarshalCBOR(br); err != nil {
52-
return nil, err
53-
}
54-
55-
metadata[i] = v
56-
}
57-
58-
return metadata, nil
29+
metadata := bindnode.Unwrap(builder.Build()).(*Metadata)
30+
return *metadata, nil
5931
}
6032

6133
// EncodeMetadata encodes metadata to an IPLD node then serializes to raw bytes
6234
func EncodeMetadata(entries Metadata) ([]byte, error) {
63-
w := new(bytes.Buffer)
64-
scratch := make([]byte, 9)
65-
if len(entries) > cbg.MaxLength {
66-
return nil, xerrors.Errorf("Slice value was too long")
67-
}
68-
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(entries))); err != nil {
35+
buf := new(bytes.Buffer)
36+
node := bindnode.Wrap(&entries, Prototype.Metadata.Type())
37+
err := dagcbor.Encode(node.Representation(), buf)
38+
if err != nil {
6939
return nil, err
7040
}
71-
for _, v := range entries {
72-
if err := v.MarshalCBOR(w); err != nil {
73-
return nil, err
74-
}
75-
}
76-
return w.Bytes(), nil
41+
return buf.Bytes(), nil
7742
}

metadata/metadata_cbor_gen.go

Lines changed: 0 additions & 129 deletions
This file was deleted.

metadata/metadata_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ func TestDecodeEncodeMetadata(t *testing.T) {
2121
for _, k := range cids {
2222
blockPresent := rand.Int31()%2 == 0
2323
initialMetadata = append(initialMetadata, Item{k, blockPresent})
24-
fla.AssembleValue().CreateMap(2, func(fma fluent.MapAssembler) {
25-
fma.AssembleEntry("link").AssignLink(cidlink.Link{Cid: k})
26-
fma.AssembleEntry("blockPresent").AssignBool(blockPresent)
24+
fla.AssembleValue().CreateList(2, func(fla fluent.ListAssembler) {
25+
fla.AssembleValue().AssignLink(cidlink.Link{Cid: k}) // Link
26+
fla.AssembleValue().AssignBool(blockPresent) // BlockPresent
2727
})
2828
}
2929
})

metadata/schema.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package metadata
2+
3+
import (
4+
_ "embed"
5+
6+
"github.com/ipld/go-ipld-prime"
7+
"github.com/ipld/go-ipld-prime/node/bindnode"
8+
"github.com/ipld/go-ipld-prime/schema"
9+
)
10+
11+
//go:embed schema.ipldsch
12+
var embedSchema []byte
13+
14+
var Prototype struct {
15+
Metadata schema.TypedPrototype
16+
}
17+
18+
func init() {
19+
ts, err := ipld.LoadSchemaBytes(embedSchema)
20+
if err != nil {
21+
panic(err)
22+
}
23+
24+
Prototype.Metadata = bindnode.Prototype((*Metadata)(nil), ts.TypeByName("Metadata"))
25+
}

metadata/schema.ipldsch

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
type Item struct {
2+
Link Link
3+
BlockPresent Bool
4+
} representation tuple
5+
6+
type Metadata [Item]

0 commit comments

Comments
 (0)