forked from Deuxfleurs/garage
util: add helper sum type for unix and tcp socket addresses
this patch introduces a new sum type that can represent either a tcp socket address or a unix domain socket path.
This commit is contained in:
parent
6086a3fa07
commit
10195f1567
2 changed files with 45 additions and 0 deletions
|
@ -14,6 +14,7 @@ pub mod forwarded_headers;
|
||||||
pub mod metrics;
|
pub mod metrics;
|
||||||
pub mod migrate;
|
pub mod migrate;
|
||||||
pub mod persister;
|
pub mod persister;
|
||||||
|
pub mod socket_address;
|
||||||
pub mod time;
|
pub mod time;
|
||||||
pub mod tranquilizer;
|
pub mod tranquilizer;
|
||||||
pub mod version;
|
pub mod version;
|
||||||
|
|
44
src/util/socket_address.rs
Normal file
44
src/util/socket_address.rs
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
use std::fmt::{Debug, Display, Formatter};
|
||||||
|
use std::net::SocketAddr;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use serde::de::Error;
|
||||||
|
use serde::{Deserialize, Deserializer};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub enum UnixOrTCPSocketAddress {
|
||||||
|
TCPSocket(SocketAddr),
|
||||||
|
UnixSocket(PathBuf),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for UnixOrTCPSocketAddress {
|
||||||
|
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
|
||||||
|
match self {
|
||||||
|
UnixOrTCPSocketAddress::TCPSocket(address) => write!(formatter, "http://{}", address),
|
||||||
|
UnixOrTCPSocketAddress::UnixSocket(path) => {
|
||||||
|
write!(formatter, "http+unix://{}", path.to_string_lossy())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de> Deserialize<'de> for UnixOrTCPSocketAddress {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let string = String::deserialize(deserializer)?;
|
||||||
|
let string = string.as_str();
|
||||||
|
|
||||||
|
if string.starts_with("/") {
|
||||||
|
Ok(UnixOrTCPSocketAddress::UnixSocket(
|
||||||
|
PathBuf::from_str(string).map_err(Error::custom)?,
|
||||||
|
))
|
||||||
|
} else {
|
||||||
|
Ok(UnixOrTCPSocketAddress::TCPSocket(
|
||||||
|
SocketAddr::from_str(string).map_err(Error::custom)?,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue