diff options
-rw-r--r-- | src/server.rs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/server.rs b/src/server.rs new file mode 100644 index 000000000000..d8be64ee7b95 --- /dev/null +++ b/src/server.rs @@ -0,0 +1,73 @@ +use crate::{ + map::Map, + wire::{Match, MatchId, MatchUser, Response, User, UserId}, +}; +use async_std::sync::{Arc, Mutex}; +use std::{collections::BTreeMap, path::Path}; + +/// A convenience result wrapper for server actions +pub type Result<T> = std::result::Result<T, ServerErr>; +pub enum ServerErr { + /// The requested directory is corrupted + NoSuchDir, + /// Corrupted game state + Corrupted, + /// No such match found + NoSuchMatch, +} + +/// The game's server backend +pub struct Server { + matches: BTreeMap<MatchId, Mutex<Match>>, + users: BTreeMap<UserId, User>, +} + +impl Server { + /// Create a new game server + fn new() -> Self { + Self { + matches: Default::default(), + users: Default::default(), + } + } + + /// Open the state dir of a game server + pub async fn open(self: Arc<Self>, path: &Path) -> Result<()> { + Ok(()) + } + + /// Stop accepting new game connections and shutdown gracefully + /// + /// Returns the number of matches still going on. + pub async fn shutdown(self: Arc<Self>) -> Result<u64> { + Ok(0) + } + + /// Save and close the statedir and kicking all players + /// + /// Returns the number of players that were kicked off the server + /// prematurely. + pub async fn kill(self: Arc<Self>) -> Result<u64> { + Ok(0) + } + + pub async fn update_map<F>(self: Arc<Self>, id: MatchId, cb: F) -> Result<Response> + where + F: Fn(&mut Map) -> Result<Response>, + { + match self.matches.get(&id) { + Some(ref mut m) => m.lock().await.map.update(cb), + None => Err(ServerErr::NoSuchMatch), + } + } + + pub async fn update_players<F>(self: Arc<Self>, id: MatchId, cb: F) -> Result<Response> + where + F: Fn(&mut Vec<MatchUser>) -> Result<Response>, + { + match self.matches.get(&id) { + Some(ref mut m) => cb(&mut m.lock().await.players), + None => Err(ServerErr::NoSuchMatch), + } + } +} |