Skip to content

Commit c3649f3

Browse files
committed
chore(metadata): convert metadata to bindnode
1 parent 45b87ff commit c3649f3

5 files changed

Lines changed: 45 additions & 199 deletions

File tree

metadata/metadata.go

Lines changed: 9 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package metadata
22

33
import (
4-
"bytes"
5-
"fmt"
6-
74
"github.com/ipfs/go-cid"
8-
cbg "github.com/whyrusleeping/cbor-gen"
9-
xerrors "golang.org/x/xerrors"
5+
"github.com/ipld/go-ipld-prime/datamodel"
6+
"github.com/ipld/go-ipld-prime/node/bindnode"
107
)
118

129
// Item is a single link traversed in a repsonse
@@ -21,57 +18,17 @@ type Metadata []Item
2118

2219
// DecodeMetadata assembles metadata from a raw byte array, first deserializing
2320
// as a node and then assembling into a metadata struct.
24-
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)
21+
func DecodeMetadata(data datamodel.Node) (Metadata, error) {
22+
builder := Prototype.Metadata.Representation().NewBuilder()
23+
err := builder.AssignNode(data)
3224
if err != nil {
3325
return nil, err
3426
}
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
27+
metadata := bindnode.Unwrap(builder.Build()).(*Metadata)
28+
return *metadata, nil
5929
}
6030

6131
// EncodeMetadata encodes metadata to an IPLD node then serializes to raw bytes
62-
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 {
69-
return nil, err
70-
}
71-
for _, v := range entries {
72-
if err := v.MarshalCBOR(w); err != nil {
73-
return nil, err
74-
}
75-
}
76-
return w.Bytes(), nil
32+
func EncodeMetadata(entries Metadata) datamodel.Node {
33+
return bindnode.Wrap(&entries, Prototype.Metadata.Type())
7734
}

metadata/metadata_cbor_gen.go

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

metadata/metadata_test.go

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package metadata
22

33
import (
4-
"bytes"
54
"math/rand"
5+
"os"
66
"testing"
77

8-
"github.com/ipld/go-ipld-prime/codec/dagcbor"
8+
"github.com/ipld/go-ipld-prime/codec/dagjson"
99
"github.com/ipld/go-ipld-prime/fluent"
1010
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
1111
"github.com/ipld/go-ipld-prime/node/basicnode"
@@ -29,29 +29,16 @@ func TestDecodeEncodeMetadata(t *testing.T) {
2929
})
3030

3131
// verify metadata matches
32-
encoded, err := EncodeMetadata(initialMetadata)
33-
require.NoError(t, err, "encode errored")
32+
encoded := EncodeMetadata(initialMetadata)
3433

3534
decodedMetadata, err := DecodeMetadata(encoded)
3635
require.NoError(t, err, "decode errored")
3736
require.Equal(t, initialMetadata, decodedMetadata, "metadata changed during encoding and decoding")
3837

3938
// verify metadata is equivalent of IPLD node encoding
40-
encodedNode := new(bytes.Buffer)
41-
err = dagcbor.Encode(nd, encodedNode)
42-
require.NoError(t, err)
43-
decodedMetadataFromNode, err := DecodeMetadata(encodedNode.Bytes())
39+
decodedMetadataFromNode, err := DecodeMetadata(nd)
4440
require.NoError(t, err)
4541
require.Equal(t, decodedMetadata, decodedMetadataFromNode, "metadata not equal to IPLD encoding")
4642

47-
nb := basicnode.Prototype.List.NewBuilder()
48-
err = dagcbor.Decode(nb, encodedNode)
49-
require.NoError(t, err)
50-
decodedNode := nb.Build()
51-
require.Equal(t, nd, decodedNode)
52-
nb = basicnode.Prototype.List.NewBuilder()
53-
err = dagcbor.Decode(nb, bytes.NewReader(encoded))
54-
require.NoError(t, err)
55-
decodedNodeFromMetadata := nb.Build()
56-
require.Equal(t, decodedNode, decodedNodeFromMetadata, "deserialzed metadata does not match deserialized node")
43+
dagjson.Encode(nd, os.Stdout)
5744
}

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 map
5+
6+
type Metadata [Item]

0 commit comments

Comments
 (0)