diff options
| author | Fuwn <[email protected]> | 2021-05-06 00:31:08 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2021-05-06 00:31:08 +0000 |
| commit | b3ee830a430e00dc8ab8f7a10ebaf1e7c931a0ad (patch) | |
| tree | fe6f5457049d0744d21cd142571662787f71eb6f /src/server/mod.rs | |
| parent | perf(subs): clippy (diff) | |
| download | whirl-b3ee830a430e00dc8ab8f7a10ebaf1e7c931a0ad.tar.xz whirl-b3ee830a430e00dc8ab8f7a10ebaf1e7c931a0ad.zip | |
refactor(server): clippy: module inception
Diffstat (limited to 'src/server/mod.rs')
| -rw-r--r-- | src/server/mod.rs | 59 |
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>>; +} |