@@ -2,11 +2,10 @@ package metadata
22
33import (
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.
2423func 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
6234func 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}
0 commit comments