use interprocess::local_socket::{GenericNamespaced, Name, ToNsName}; use manhunt_logic::{GameHistory, GameSettings, GameUiState, LobbyState, PowerUpType}; use serde::{Deserialize, Serialize}; pub mod prelude { pub use anyhow::{Context, anyhow, bail}; pub type Result = std::result::Result; } pub use prelude::*; pub fn get_socket_name(base_name: String) -> Result> { base_name .to_ns_name::() .context("Failed to parse socket name") } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum LobbyRequest { SwitchTeams(bool), HostStartGame, HostUpdateSettings(GameSettings), Leave, } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum GameRequest { NextTick, MarkCaught, GetPowerup, UsePowerup, ForcePowerup(PowerUpType), Quit, } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum TestingRequest { StartLobby(GameSettings), JoinLobby(String), LobbyReq(LobbyRequest), GameReq(GameRequest), } impl From for TestingRequest { fn from(val: LobbyRequest) -> Self { TestingRequest::LobbyReq(val) } } impl From for TestingRequest { fn from(val: GameRequest) -> Self { TestingRequest::GameReq(val) } } impl TryInto for TestingRequest { type Error = TestingResponse; fn try_into(self) -> Result { if let Self::LobbyReq(lr) = self { Ok(lr) } else { Err(TestingResponse::WrongScreen) } } } impl TryInto for TestingRequest { type Error = TestingResponse; fn try_into(self) -> Result { if let Self::GameReq(gr) = self { Ok(gr) } else { Err(TestingResponse::WrongScreen) } } } #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] pub enum ScreenUpdate { PreConnect, Lobby, Game, } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum TestingResponse { Complete, ScreenChanged(ScreenUpdate), LobbyStateUpdate(LobbyState), GameStateUpdate(GameUiState), GameOver(GameHistory), WrongScreen, Error(String), } impl From for TestingResponse { fn from(val: GameHistory) -> Self { TestingResponse::GameOver(val) } } impl From for TestingResponse { fn from(value: anyhow::Error) -> Self { TestingResponse::Error(value.to_string()) } } impl From for TestingResponse { fn from(val: ScreenUpdate) -> Self { TestingResponse::ScreenChanged(val) } } impl From for TestingResponse { fn from(val: LobbyState) -> Self { TestingResponse::LobbyStateUpdate(val) } } impl From for TestingResponse { fn from(val: GameUiState) -> Self { TestingResponse::GameStateUpdate(val) } }