Unverified Commit adcd7247 authored by Steven Allen's avatar Steven Allen Committed by GitHub

refactor: use a helper type to decode AddrInfo from JSON (#178)

This saves us a bunch of error prone manual decode/encode logic.
Co-authored-by: default avatarMarten Seemann <martenseemann@gmail.com>
parent 31daef6c
...@@ -6,33 +6,38 @@ import ( ...@@ -6,33 +6,38 @@ import (
ma "github.com/multiformats/go-multiaddr" ma "github.com/multiformats/go-multiaddr"
) )
// Helper struct for decoding as we can't unmarshal into an interface (Multiaddr).
type addrInfoJson struct {
ID ID
Addrs []string
}
func (pi AddrInfo) MarshalJSON() ([]byte, error) { func (pi AddrInfo) MarshalJSON() ([]byte, error) {
out := make(map[string]interface{}) addrs := make([]string, len(pi.Addrs))
out["ID"] = pi.ID.Pretty() for i, addr := range pi.Addrs {
var addrs []string addrs[i] = addr.String()
for _, a := range pi.Addrs {
addrs = append(addrs, a.String())
} }
out["Addrs"] = addrs return json.Marshal(&addrInfoJson{
return json.Marshal(out) ID: pi.ID,
Addrs: addrs,
})
} }
func (pi *AddrInfo) UnmarshalJSON(b []byte) error { func (pi *AddrInfo) UnmarshalJSON(b []byte) error {
var data map[string]interface{} var data addrInfoJson
err := json.Unmarshal(b, &data) if err := json.Unmarshal(b, &data); err != nil {
if err != nil {
return err return err
} }
pid, err := IDB58Decode(data["ID"].(string)) addrs := make([]ma.Multiaddr, len(data.Addrs))
if err != nil { for i, addr := range data.Addrs {
return err maddr, err := ma.NewMultiaddr(addr)
} if err != nil {
pi.ID = pid return err
addrs, ok := data["Addrs"].([]interface{})
if ok {
for _, a := range addrs {
pi.Addrs = append(pi.Addrs, ma.StringCast(a.(string)))
} }
addrs[i] = maddr
} }
pi.ID = data.ID
pi.Addrs = addrs
return nil return nil
} }
...@@ -133,3 +133,21 @@ func TestAddrInfosFromP2pAddrs(t *testing.T) { ...@@ -133,3 +133,21 @@ func TestAddrInfosFromP2pAddrs(t *testing.T) {
delete(expected, info.ID.Pretty()) delete(expected, info.ID.Pretty())
} }
} }
func TestAddrInfoJSON(t *testing.T) {
ai := AddrInfo{ID: testID, Addrs: []ma.Multiaddr{maddrFull}}
out, err := ai.MarshalJSON()
if err != nil {
t.Fatal(err)
}
var addrInfo AddrInfo
if err := addrInfo.UnmarshalJSON(out); err != nil {
t.Fatal(err)
}
if addrInfo.ID != testID {
t.Fatalf("expected ID to equal %s, got %s", testID.Pretty(), addrInfo.ID.Pretty())
}
if len(addrInfo.Addrs) != 1 || !addrInfo.Addrs[0].Equal(maddrFull) {
t.Fatalf("expected addrs to match %v, got %v", maddrFull, addrInfo.Addrs)
}
}
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