mirror of
https://github.com/libp2p/go-libp2p-core.git
synced 2025-02-06 06:00:08 +08:00
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: Marten Seemann <martenseemann@gmail.com>
This commit is contained in:
parent
31daef6c63
commit
adcd724744
@ -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) {
|
|||||||
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user