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  }