zakura_network/meta_addr/
peer_addr.rs1use std::{
4 fmt,
5 net::{Ipv4Addr, Ipv6Addr, SocketAddr},
6 ops::{Deref, DerefMut},
7 str::FromStr,
8};
9
10#[cfg(any(test, feature = "proptest-impl"))]
11use proptest_derive::Arbitrary;
12
13#[derive(
15 Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, serde::Serialize, serde::Deserialize,
16)]
17#[serde(transparent)]
18#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary))]
19#[derive(schemars::JsonSchema)]
20pub struct PeerSocketAddr(SocketAddr);
21
22impl fmt::Debug for PeerSocketAddr {
23 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24 fmt::Display::fmt(self, f)
25 }
26}
27
28impl fmt::Display for PeerSocketAddr {
29 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
30 let ip_version = if self.is_ipv4() { "v4" } else { "v6" };
31
32 f.pad(&format!("{}redacted:{}", ip_version, self.port()))
34 }
35}
36
37impl FromStr for PeerSocketAddr {
38 type Err = <SocketAddr as FromStr>::Err;
39
40 fn from_str(s: &str) -> Result<Self, Self::Err> {
41 Ok(Self(s.parse()?))
42 }
43}
44
45impl<S> From<S> for PeerSocketAddr
46where
47 S: Into<SocketAddr>,
48{
49 fn from(value: S) -> Self {
50 Self(value.into())
51 }
52}
53
54impl Deref for PeerSocketAddr {
55 type Target = SocketAddr;
56
57 fn deref(&self) -> &Self::Target {
58 &self.0
59 }
60}
61
62impl DerefMut for PeerSocketAddr {
63 fn deref_mut(&mut self) -> &mut Self::Target {
64 &mut self.0
65 }
66}
67
68impl PeerSocketAddr {
69 pub fn unspecified() -> Self {
71 Self(SocketAddr::new(Ipv4Addr::UNSPECIFIED.into(), 0))
72 }
73
74 pub fn remove_socket_addr_privacy(&self) -> SocketAddr {
77 **self
78 }
79
80 pub(crate) fn addr_label(&self, expose_peer_addresses: bool) -> String {
85 if expose_peer_addresses {
86 self.remove_socket_addr_privacy().to_string()
87 } else {
88 self.to_string()
89 }
90 }
91
92 pub fn is_localhost(&self) -> bool {
94 let ip = self.0.ip();
95 ip == Ipv4Addr::LOCALHOST || ip == Ipv6Addr::LOCALHOST
96 }
97}