summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2022-12-23 16:16:35 -0500
committerKjetil Orbekk <kj@orbekk.com>2022-12-23 16:18:41 -0500
commit45ce66a29b3d1c49ef8e86b125701e89d58e8a4a (patch)
tree14d67dfef5c2d5e1aa7e4100526973cbd0ba4c2b /server
parent82c447fbfe12ee76dbbdaa36b0de1343d3a91795 (diff)
Generalize table state to include the result of play
Diffstat (limited to 'server')
-rw-r--r--server/src/main.rs21
-rw-r--r--server/src/play.rs40
2 files changed, 24 insertions, 37 deletions
diff --git a/server/src/main.rs b/server/src/main.rs
index 969bc25..a9e8f69 100644
--- a/server/src/main.rs
+++ b/server/src/main.rs
@@ -9,7 +9,10 @@ use axum::{
routing::{delete, get, post},
Json, Router,
};
-use protocol::{bridge_engine::{Bid, GameStatePlayerView, Player}, card::Card};
+use protocol::{
+ bridge_engine::{Bid, GameStatePlayerView, Player, TableStatePlayerView},
+ card::Card,
+};
use protocol::{Table, UserInfo};
use server::ServerState;
use tower_cookies::{Cookie, CookieManagerLayer, Cookies};
@@ -147,17 +150,19 @@ async fn get_table_view(
_session: AuthenticatedSession,
State(state): ServerState,
Path(id): Path<Uuid>,
-) -> Result<Json<protocol::bridge_engine::GameStatePlayerView>, BridgeError> {
+) -> Result<Json<TableStatePlayerView>, BridgeError> {
info!("Getting table state for {id:}");
let player_position = Player::South;
let jnl = DbJournal::new(state.db.clone(), id);
let mut table = play::Table::new_or_replay(jnl).await?;
info!("Advancing play");
- while table.game()?.current_player() != player_position {
+ while table.game_in_progress()
+ && table.game()?.current_player() != player_position
+ {
advance_play(&mut table).await?;
}
- let response = Json(GameStatePlayerView::from_game_state(
- table.game()?,
+ let response = Json(TableStatePlayerView::from_table_state(
+ &table.state,
player_position,
));
info!("Response: {response:#?}");
@@ -304,6 +309,10 @@ mod tests {
pub fn test_setup() {
dotenv::dotenv().ok();
- let _ =env_logger::Builder::from_env(Env::default().default_filter_or("info")).is_test(true).try_init();
+ let _ = env_logger::Builder::from_env(
+ Env::default().default_filter_or("info"),
+ )
+ .is_test(true)
+ .try_init();
}
}
diff --git a/server/src/play.rs b/server/src/play.rs
index ffb7407..e0d4733 100644
--- a/server/src/play.rs
+++ b/server/src/play.rs
@@ -3,10 +3,9 @@ use protocol::{
bot::{BiddingBot, PlayingBot},
bridge_engine::{
Bid, BiddingStatePlayerView, Deal, GameResult, GameState,
- PlayStatePlayerView, Player,
+ PlayStatePlayerView, Player, TableState,
},
card::Card,
- play_result::MoveResult,
simple_bots::{AlwaysPassBiddingBot, RandomPlayingBot},
};
use rand::random;
@@ -125,35 +124,7 @@ where
{
journal: J,
settings: TableSettings,
- state: TableState,
-}
-
-#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)]
-pub enum TableState {
- Unknown,
- Game(GameState),
- Result(GameResult),
-}
-
-impl Default for TableState {
- fn default() -> Self {
- TableState::Unknown
- }
-}
-
-impl Into<TableState> for MoveResult<GameState, GameResult> {
- fn into(self) -> TableState {
- match self {
- MoveResult::Stay(game) => TableState::Game(game),
- MoveResult::Go(result) => TableState::Result(result),
- }
- }
-}
-
-impl Into<TableState> for GameState {
- fn into(self) -> TableState {
- TableState::Game(self)
- }
+ pub state: TableState,
}
impl<J: Journal<TableUpdate>> Table<J> {
@@ -167,6 +138,13 @@ impl<J: Journal<TableUpdate>> Table<J> {
Ok(table)
}
+ pub fn game_in_progress(&self) -> bool {
+ match &self.state {
+ TableState::Game(_) => true,
+ _ => false,
+ }
+ }
+
pub fn game(&self) -> Result<&GameState, BridgeError> {
match &self.state {
TableState::Game(g) => Ok(g),