Commit 6b350ac3 authored by Jeromy's avatar Jeromy

Add json unmarshal code and fix panic

A panic would occur when a link was created with a nil cid, this should
be allowable, just catch the potential problem and skip marshaling the
cid.

License: MIT
Signed-off-by: default avatarJeromy <why@ipfs.io>
parent eddf3ec3
...@@ -60,8 +60,10 @@ func (n *ProtoNode) getPBNode() *pb.PBNode { ...@@ -60,8 +60,10 @@ func (n *ProtoNode) getPBNode() *pb.PBNode {
pbn.Links[i] = &pb.PBLink{} pbn.Links[i] = &pb.PBLink{}
pbn.Links[i].Name = &l.Name pbn.Links[i].Name = &l.Name
pbn.Links[i].Tsize = &l.Size pbn.Links[i].Tsize = &l.Size
if l.Cid != nil {
pbn.Links[i].Hash = l.Cid.Bytes() pbn.Links[i].Hash = l.Cid.Bytes()
} }
}
if len(n.data) > 0 { if len(n.data) > 0 {
pbn.Data = n.data pbn.Data = n.data
......
...@@ -229,6 +229,22 @@ func (n *ProtoNode) Loggable() map[string]interface{} { ...@@ -229,6 +229,22 @@ func (n *ProtoNode) Loggable() map[string]interface{} {
} }
} }
func (n *ProtoNode) UnmarshalJSON(b []byte) error {
s := struct {
Data []byte `json:"data"`
Links []*node.Link `json:"links"`
}{}
err := json.Unmarshal(b, &s)
if err != nil {
return err
}
n.data = s.Data
n.links = s.Links
return nil
}
func (n *ProtoNode) MarshalJSON() ([]byte, error) { func (n *ProtoNode) MarshalJSON() ([]byte, error) {
out := map[string]interface{}{ out := map[string]interface{}{
"data": n.data, "data": n.data,
......
package merkledag_test package merkledag_test
import ( import (
"bytes"
"context" "context"
"testing" "testing"
...@@ -128,3 +129,32 @@ func TestNodeCopy(t *testing.T) { ...@@ -128,3 +129,32 @@ func TestNodeCopy(t *testing.T) {
t.Fatal("should be different objects") t.Fatal("should be different objects")
} }
} }
func TestJsonRoundtrip(t *testing.T) {
nd := new(ProtoNode)
nd.SetLinks([]*node.Link{
{Name: "a"},
{Name: "c"},
{Name: "b"},
})
nd.SetData([]byte("testing"))
jb, err := nd.MarshalJSON()
if err != nil {
t.Fatal(err)
}
nn := new(ProtoNode)
err = nn.UnmarshalJSON(jb)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(nn.Data(), nd.Data()) {
t.Fatal("data wasnt the same")
}
if !nn.Cid().Equals(nd.Cid()) {
t.Fatal("objects differed after marshaling")
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment