From e7167b17d96cea1c31ca77e36cc0248c18b818c6 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Sun, 18 Dec 2022 12:38:13 -0500 Subject: Implement advance_play for passing bidding bot --- server/src/play.rs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'server/src') diff --git a/server/src/play.rs b/server/src/play.rs index 17d5819..c4dc5c7 100644 --- a/server/src/play.rs +++ b/server/src/play.rs @@ -1,9 +1,10 @@ use async_trait::async_trait; -use protocol::{bridge_engine::{GameState, Player, Bid, Deal}}; +use protocol::{bridge_engine::{GameState, Player, Bid, Deal, BiddingStatePlayerView}, simple_bots::AlwaysPassBiddingBot, bot::BiddingBot}; use rand::random; use serde::{Deserialize, Serialize}; use serde_json::json; use sqlx::{query, PgPool}; +use tracing::error; use uuid::Uuid; use crate::error::BridgeError; @@ -140,8 +141,24 @@ impl Table { } -pub fn advance_play(table: &mut Table) { - todo!() +pub async fn advance_play(table: &mut Table) -> Result<(), BridgeError> { + let current_player = match table.game().current_player() { + Some(player) => player, + None => { + return Err(BridgeError::InvalidRequest(format!("No play to make for game"))); + }, + }; + match table.game() { + GameState::Bidding(bidding) => { + let player_view = BiddingStatePlayerView::from_bidding_state(bidding, current_player); + let bot = AlwaysPassBiddingBot {}; + let bid = bot.bid(&player_view).await; + table.bid(bid).await?; + Ok(()) + }, + GameState::Play(_) => todo!(), + GameState::PassedOut { dealer, deal, bidding } => todo!(), + } } #[cfg(test)] @@ -215,7 +232,7 @@ mod test { async fn test_advance_play() { let mut t1: Table = Table::new(Default::default()).await.unwrap(); let player = t1.game().current_player(); - advance_play(&mut t1); + advance_play(&mut t1).await.unwrap(); assert_ne!(player, t1.game().current_player()); } } -- cgit v1.2.3