shadowsocks_service/local/dns/
config.rs1#[cfg(unix)]
4use std::{convert::Infallible, path::PathBuf};
5use std::{
6 fmt::{self, Display},
7 net::{IpAddr, SocketAddr},
8 str::FromStr,
9};
10
11#[derive(Debug, Clone, Eq, PartialEq, Hash)]
13pub enum NameServerAddr {
14 SocketAddr(SocketAddr),
16 #[cfg(unix)]
20 UnixSocketAddr(PathBuf),
21}
22
23#[cfg(unix)]
25pub type NameServerAddrError = Infallible;
26#[cfg(not(unix))]
28pub type NameServerAddrError = <SocketAddr as FromStr>::Err;
29
30impl FromStr for NameServerAddr {
31 type Err = NameServerAddrError;
32
33 fn from_str(s: &str) -> Result<Self, Self::Err> {
34 if let Ok(ip) = s.parse::<IpAddr>() {
35 return Ok(Self::SocketAddr(SocketAddr::new(ip, 53)));
36 }
37
38 match s.parse::<SocketAddr>() {
39 Ok(addr) => Ok(Self::SocketAddr(addr)),
40 #[cfg(unix)]
41 Err(..) => Ok(Self::UnixSocketAddr(PathBuf::from(s))),
42 #[cfg(not(unix))]
43 Err(err) => Err(err),
44 }
45 }
46}
47
48impl Display for NameServerAddr {
49 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50 match *self {
51 Self::SocketAddr(ref sa) => Display::fmt(sa, f),
52 #[cfg(unix)]
53 Self::UnixSocketAddr(ref p) => write!(f, "{}", p.display()),
54 }
55 }
56}