ouisync/network/
peer_info.rs

1use super::{peer_addr::PeerAddr, peer_source::PeerSource, peer_state::PeerState, stats::Stats};
2use ouisync_macros::api;
3use serde::{de::Error as _, Deserialize, Deserializer, Serialize, Serializer};
4
5/// Information about a peer.
6#[derive(Eq, PartialEq, Serialize, Deserialize, Debug)]
7#[api]
8pub struct PeerInfo {
9    #[serde(with = "as_str")]
10    pub addr: PeerAddr,
11    pub source: PeerSource,
12    pub state: PeerState,
13    pub stats: Stats,
14}
15
16mod as_str {
17    use super::*;
18
19    pub fn serialize<S>(value: &PeerAddr, s: S) -> Result<S::Ok, S::Error>
20    where
21        S: Serializer,
22    {
23        value.to_string().serialize(s)
24    }
25
26    pub fn deserialize<'de, D>(d: D) -> Result<PeerAddr, D::Error>
27    where
28        D: Deserializer<'de>,
29    {
30        <&str>::deserialize(d)?.parse().map_err(D::Error::custom)
31    }
32}