github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/neorpc/result/peers.go (about) 1 package result 2 3 import ( 4 "encoding/json" 5 "net" 6 "strconv" 7 ) 8 9 type ( 10 // GetPeers payload for outputting peers in `getpeers` RPC call. 11 GetPeers struct { 12 Unconnected Peers `json:"unconnected"` 13 Connected Peers `json:"connected"` 14 Bad Peers `json:"bad"` 15 } 16 17 // Peers represents a slice of peers. 18 Peers []Peer 19 20 // Peer represents a peer. 21 Peer struct { 22 Address string `json:"address"` 23 Port uint16 `json:"port"` 24 } 25 ) 26 27 // NewGetPeers creates a new GetPeers structure. 28 func NewGetPeers() GetPeers { 29 return GetPeers{ 30 Unconnected: []Peer{}, 31 Connected: []Peer{}, 32 Bad: []Peer{}, 33 } 34 } 35 36 // AddUnconnected adds a set of peers to the unconnected peers slice. 37 func (g *GetPeers) AddUnconnected(addrs []string) { 38 g.Unconnected.addPeers(addrs) 39 } 40 41 // AddConnected adds a set of peers to the connected peers slice. 42 func (g *GetPeers) AddConnected(addrs []string) { 43 g.Connected.addPeers(addrs) 44 } 45 46 // AddBad adds a set of peers to the bad peers slice. 47 func (g *GetPeers) AddBad(addrs []string) { 48 g.Bad.addPeers(addrs) 49 } 50 51 // addPeers adds a set of peers to the given peer slice. 52 func (p *Peers) addPeers(addrs []string) { 53 for i := range addrs { 54 host, portStr, err := net.SplitHostPort(addrs[i]) 55 if err != nil { 56 continue 57 } 58 port, err := strconv.ParseUint(portStr, 10, 16) 59 if err != nil { 60 port = 0 61 } 62 peer := Peer{ 63 Address: host, 64 Port: uint16(port), 65 } 66 67 *p = append(*p, peer) 68 } 69 } 70 71 func (p *Peer) UnmarshalJSON(data []byte) error { 72 type NewPeer Peer 73 var np NewPeer 74 75 err := json.Unmarshal(data, &np) 76 if err == nil { 77 *p = Peer(np) 78 return nil 79 } 80 81 type OldPeer struct { 82 Address string `json:"address"` 83 Port string `json:"port"` 84 } 85 var op OldPeer 86 87 err = json.Unmarshal(data, &op) 88 if err == nil { 89 port, err := strconv.ParseUint(op.Port, 10, 16) 90 if err != nil { 91 return err 92 } 93 94 *p = Peer{ 95 Address: op.Address, 96 Port: uint16(port), 97 } 98 } 99 return err 100 }