aboutsummaryrefslogtreecommitdiff
path: root/src/server/mod.rs
diff options
context:
space:
mode:
authorFuwn <[email protected]>2021-05-06 00:31:08 +0000
committerFuwn <[email protected]>2021-05-06 00:31:08 +0000
commitb3ee830a430e00dc8ab8f7a10ebaf1e7c931a0ad (patch)
treefe6f5457049d0744d21cd142571662787f71eb6f /src/server/mod.rs
parentperf(subs): clippy (diff)
downloadwhirl-b3ee830a430e00dc8ab8f7a10ebaf1e7c931a0ad.tar.xz
whirl-b3ee830a430e00dc8ab8f7a10ebaf1e7c931a0ad.zip
refactor(server): clippy: module inception
Diffstat (limited to 'src/server/mod.rs')
-rw-r--r--src/server/mod.rs59
1 files changed, 58 insertions, 1 deletions
diff --git a/src/server/mod.rs b/src/server/mod.rs
index 369cb38..1f986c5 100644
--- a/src/server/mod.rs
+++ b/src/server/mod.rs
@@ -8,5 +8,62 @@ pub mod net;
pub mod distributor;
pub mod hub;
mod packet_parser;
-pub mod server;
mod types;
+
+use std::{error::Error, fmt, net::SocketAddr, sync::Arc};
+
+use tokio::{
+ net::{TcpListener, TcpStream},
+ sync::Mutex,
+};
+
+use crate::server::interaction::shared::Shared;
+
+#[derive(Debug)]
+pub enum ServerType {
+ AnonRoomServer,
+ AnonUserServer,
+ AutoServer,
+ RoomServer,
+ UserServer,
+}
+// https://stackoverflow.com/a/32712140/14452787
+impl fmt::Display for ServerType {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self) }
+}
+
+#[async_trait::async_trait]
+pub trait Server {
+ async fn listen(address: &str, server_type: ServerType) -> Result<(), Box<dyn Error>> {
+ let listener = TcpListener::bind(address).await?;
+ let state = Arc::new(Mutex::new(Shared::new()));
+ let mut counter = 0;
+
+ info!(
+ "server of type {} now listening at {}",
+ server_type.to_string(),
+ address
+ );
+
+ loop {
+ let (stream, address) = listener.accept().await?;
+ counter += 1;
+ let state = Arc::clone(&state);
+
+ trace!("accepted client at {}", address);
+
+ tokio::spawn(async move {
+ if let Err(e) = Self::handle(state, stream, address, counter).await {
+ error!("an error occurred: {}", e);
+ }
+ });
+ }
+ }
+
+ async fn handle(
+ state: Arc<Mutex<Shared>>,
+ stream: TcpStream,
+ _address: SocketAddr,
+ count: usize,
+ ) -> Result<(), Box<dyn Error>>;
+}