tokio_listener/
some_socket_addr.rs

1#[allow(unused_imports)]
2use std::{fmt::Display, net::SocketAddr, sync::Arc};
3
4/// Some form of accepted connection's address.
5/// Variant depends on variant used in [`ListenerAddress`].
6#[derive(Debug)]
7#[non_exhaustive]
8#[allow(missing_docs)]
9pub enum SomeSocketAddr {
10    Tcp(SocketAddr),
11    #[cfg(all(feature = "unix", unix))]
12    #[cfg_attr(docsrs_alt, doc(cfg(all(feature = "unix", unix))))]
13    Unix(tokio::net::unix::SocketAddr),
14    #[cfg(feature = "inetd")]
15    #[cfg_attr(docsrs_alt, doc(cfg(feature = "inetd")))]
16    Stdio,
17    #[cfg(feature = "multi-listener")]
18    #[cfg_attr(docsrs_alt, doc(cfg(feature = "multi-listener")))]
19    Multiple,
20}
21
22impl Display for SomeSocketAddr {
23    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24        match self {
25            SomeSocketAddr::Tcp(x) => x.fmt(f),
26            #[cfg(all(feature = "unix", unix))]
27            SomeSocketAddr::Unix(_x) => "unix".fmt(f),
28            #[cfg(feature = "inetd")]
29            SomeSocketAddr::Stdio => "stdio".fmt(f),
30            #[cfg(feature = "multi-listener")]
31            SomeSocketAddr::Multiple => "multiple".fmt(f),
32        }
33    }
34}
35
36impl SomeSocketAddr {
37    /// Convert this address representation into a clonable form.
38    /// For UNIX socket addresses, it converts them to a string using Debug representation.
39    #[must_use]
40    pub fn clonable(self) -> SomeSocketAddrClonable {
41        match self {
42            SomeSocketAddr::Tcp(x) => SomeSocketAddrClonable::Tcp(x),
43            #[cfg(all(feature = "unix", unix))]
44            SomeSocketAddr::Unix(x) => SomeSocketAddrClonable::Unix(Arc::new(x)),
45            #[cfg(feature = "inetd")]
46            SomeSocketAddr::Stdio => SomeSocketAddrClonable::Stdio,
47            #[cfg(feature = "multi-listener")]
48            SomeSocketAddr::Multiple => SomeSocketAddrClonable::Multiple,
49        }
50    }
51}
52
53/// Other representation of [`SomeSocketAddr`] with Arc-wrapped Unix addresses to enable cloning
54#[derive(Debug, Clone)]
55#[non_exhaustive]
56#[allow(missing_docs)]
57pub enum SomeSocketAddrClonable {
58    Tcp(SocketAddr),
59    #[cfg(all(feature = "unix", unix))]
60    #[cfg_attr(docsrs_alt, doc(cfg(all(feature = "unix", unix))))]
61    Unix(Arc<tokio::net::unix::SocketAddr>),
62    #[cfg(feature = "inetd")]
63    #[cfg_attr(docsrs_alt, doc(cfg(feature = "inetd")))]
64    Stdio,
65    #[cfg(feature = "multi-listener")]
66    #[cfg_attr(docsrs_alt, doc(cfg(feature = "multi-listener")))]
67    Multiple,
68}
69
70impl Display for SomeSocketAddrClonable {
71    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
72        match self {
73            SomeSocketAddrClonable::Tcp(x) => x.fmt(f),
74            #[cfg(all(feature = "unix", unix))]
75            SomeSocketAddrClonable::Unix(x) => write!(f, "unix:{x:?}"),
76            #[cfg(feature = "inetd")]
77            SomeSocketAddrClonable::Stdio => "stdio".fmt(f),
78            #[cfg(feature = "multi-listener")]
79            SomeSocketAddrClonable::Multiple => "multiple".fmt(f),
80        }
81    }
82}
83
84impl From<SomeSocketAddr> for SomeSocketAddrClonable {
85    fn from(value: SomeSocketAddr) -> Self {
86        value.clonable()
87    }
88}