diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/address.rs | 42 | ||||
| -rw-r--r-- | src/server/mod.rs | 1 |
2 files changed, 35 insertions, 8 deletions
diff --git a/src/server/address.rs b/src/server/address.rs index 3d8e59f..9fb7bea 100644 --- a/src/server/address.rs +++ b/src/server/address.rs @@ -1,19 +1,45 @@ +use std::path::PathBuf; use std::net::SocketAddr; -use std::path::Path; +use std::str::FromStr; use crate::{ Result, - aerr + aerr, + util::AnyError }; use super::tcpserver::TcpServer; use super::unixserver::UnixServer; use super::Server; -pub fn server_from_address(typename: &str, text: &str) -> Result<Box<dyn Server>> { - match typename { - "inet" => Ok(Box::new(TcpServer::new(&text.parse()?)?)), - "unix" => Ok(Box::new(UnixServer::new(Path::new(text))?)), - "abstract" => Ok(Box::new(UnixServer::new(Path::new(&format!("\0{}", text)))?)), - _ => Err(aerr!("Invalid address type")) +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum Address { + Inet(SocketAddr), + Unix(PathBuf) +} + +impl Address { + pub fn to_server(&self) -> Result<Box<dyn Server>> { + match self { + Address::Inet(addr) => Ok(Box::new(TcpServer::new(addr)?)), + Address::Unix(path) => Ok(Box::new(UnixServer::new(path)?)), + } + } +} + +impl FromStr for Address { + type Err = AnyError; + fn from_str(s: &str) -> std::result::Result<Self, Self::Err> { + let parts: Vec<&str> = s.splitn(2, ':').collect(); + if parts.len() != 2 { + return Err(aerr!("Address string has the wrong length!")); + } + let typename = parts[0]; + let text = parts[1]; + match typename { + "inet" => Ok(Address::Inet(text.parse()?)), + "unix" => Ok(Address::Unix(PathBuf::new().join(text))), + "abstract" => Ok(Address::Unix(PathBuf::new().join(&format!("\0{}", text)))), + _ => Err(aerr!(&format!("'{}' is not a valid address type", typename))) + } } } diff --git a/src/server/mod.rs b/src/server/mod.rs index 131eb19..71b1f96 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -2,6 +2,7 @@ use std::io; pub mod tcpserver; pub mod unixserver; +pub mod address; mod streamconnection; |
