summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-03 18:26:38 +0200
committertroido <troido@protonmail.com>2020-04-03 18:26:38 +0200
commitfd0bd24fa4e98b3bcd95a14ff844411727fb4433 (patch)
tree06e924a0f1ba31abb2e3d1cfb40d9b1f9354e01f /src/server
parent94ec558680b70ed747519d5fd787d94b74ae470d (diff)
added command line options
Diffstat (limited to 'src/server')
-rw-r--r--src/server/address.rs42
-rw-r--r--src/server/mod.rs1
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;