-
Notifications
You must be signed in to change notification settings - Fork 1
/
addr_info.go
108 lines (95 loc) · 2.38 KB
/
addr_info.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package core
import (
"encoding/json"
"fmt"
ma "github.com/multiformats/go-multiaddr"
)
// AddrInfo ...
type AddrInfo struct {
ID string `json:"id"`
PublicKey string `json:"public_key"`
Addrs map[ma.Multiaddr]bool `json:"addrs"`
DataStore DataStoreInfo `json:"data_store"`
}
type jsonIPFSAddrInfo struct {
ID string `json:"id"`
Addrs []string `json:"addrs"`
}
type jsonAddrInfo struct {
ID string `json:"id"`
PublicKey string `json:"public_key"`
Addrs []string `json:"addrs"`
DataStore DataStoreInfo `json:"data_store"`
//IPFSAddrInfo peer.AddrInfo `json:"ipfs_addr_info"`
}
func parseAddrInfo(b []byte, addrInfo *AddrInfo) error {
var info jsonAddrInfo
err := json.Unmarshal(b, &info)
if err != nil {
return fmt.Errorf("unmarshal address info failed:%w", err)
}
addrInfo.ID = info.ID
addrInfo.PublicKey = info.PublicKey
addrInfo.DataStore = info.DataStore
addrs := make(map[ma.Multiaddr]bool, len(info.Addrs))
for i := range info.Addrs {
multiaddr, err := ma.NewMultiaddr(info.Addrs[i])
if err != nil {
continue
}
addrs[multiaddr] = true
}
addrInfo.Addrs = addrs
return nil
}
// MarshalJSON ...
func (info AddrInfo) MarshalJSON() ([]byte, error) {
addrInfo := jsonAddrInfo{
ID: info.ID,
PublicKey: info.PublicKey,
Addrs: nil,
DataStore: info.DataStore,
}
for multiaddr := range info.Addrs {
addrInfo.Addrs = append(addrInfo.Addrs, multiaddr.String())
}
return json.Marshal(addrInfo)
}
// UnmarshalJSON ...
func (info *AddrInfo) UnmarshalJSON(bytes []byte) error {
return parseAddrInfo(bytes, info)
}
// NewAddrInfo ...
func NewAddrInfo(id string, addrs ...string) *AddrInfo {
_addrs := make(map[ma.Multiaddr]bool, len(addrs))
for _, addr := range addrs {
multiaddr, err := ma.NewMultiaddr(addr)
if err != nil {
continue
}
_addrs[multiaddr] = true
}
return &AddrInfo{
ID: id,
Addrs: _addrs,
}
}
// SetDataStoreInfo ...
func (info *AddrInfo) SetDataStoreInfo(dataStoreInfo DataStoreInfo) {
info.DataStore = dataStoreInfo
}
// SetID ...
func (info *AddrInfo) SetID(id string) {
info.ID = id
}
// AppendAddr ...
func (info *AddrInfo) AppendAddr(multiaddr ma.Multiaddr) {
info.Addrs[multiaddr] = true
}
// GetAddrs ...
func (info *AddrInfo) GetAddrs() (addrs []ma.Multiaddr) {
for addr := range info.Addrs {
addrs = append(addrs, addr)
}
return
}