From b3ee830a430e00dc8ab8f7a10ebaf1e7c931a0ad Mon Sep 17 00:00:00 2001 From: Fuwn Date: Thu, 6 May 2021 00:31:08 +0000 Subject: refactor(server): clippy: module inception --- src/server/mod.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) (limited to 'src/server/mod.rs') 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> { + 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>, + stream: TcpStream, + _address: SocketAddr, + count: usize, + ) -> Result<(), Box>; +} -- cgit v1.2.3