use crate::bridge_engine::{self, Contract, DealInPlay, DealInPlayResult, Player}; use crate::card; use crate::card::Deal; use crate::card::Suit; use crate::components::{Bidding, Hand, ShowBid, TrickInPlay, TricksPlayed}; use log::{error, info}; use yew::prelude::*; pub const SUIT_DISPLAY_ORDER: [Suit; 4] = [Suit::Diamond, Suit::Club, Suit::Heart, Suit::Spade]; #[derive(Debug, Clone)] enum GameState { Bidding { dealer: Player, deal: Deal, }, PassedOut { _dealer: Player, deal: Deal, _bidding: bridge_engine::Bidding, }, Play { playing_deal: DealInPlay, contract: Contract, bidding: bridge_engine::Bidding, }, } impl GameState { fn deal(&self) -> &Deal { match self { Self::Bidding { deal, .. } => deal, Self::PassedOut { deal, .. } => deal, Self::Play { playing_deal, .. } => &playing_deal.deal(), } } } pub fn deal() -> card::Deal { let mut rng = rand::thread_rng(); let mut deal = card::deal(&mut rng); deal.sort(&SUIT_DISPLAY_ORDER, card::RankOrder::Descending); deal } fn init_state() -> GameState { let dealer = Player::East; let deal = deal(); GameState::Bidding { dealer, deal } } #[function_component(Game)] pub fn game() -> Html { let state = use_state(|| init_state()); let shuffle = { let state = state.clone(); Callback::from(move |_| { state.set(init_state()); }) }; let on_card_clicked = { let state = state.clone(); Callback::from(move |card| { if let GameState::Play { playing_deal, contract, bidding, } = (*state).clone() { info!("Card clicked: {}", card); match playing_deal.play(card) { Err(err) => error!("Could not play card: {:?}", err), Ok(DealInPlayResult::InProgress(playing_deal)) => state.set(GameState::Play { playing_deal, contract, bidding, }), Ok(DealInPlayResult::PlayFinished(tricks)) => todo!(), }; } }) }; let center = match &*state { GameState::Bidding { dealer, deal } => { let on_contract = { let state = state.clone(); let dealer = dealer.clone(); let deal = deal.clone(); Callback::from(move |(contract, bidding)| { state.set(match contract { Some(contract) => GameState::Play { playing_deal: DealInPlay::new(dealer, deal.clone()), contract, bidding, }, None => GameState::PassedOut { _dealer: dealer, deal: deal.clone(), _bidding: bidding, }, }); }) }; html! { } } GameState::Play { playing_deal, contract, bidding, } => { html! { <> } } GameState::PassedOut { .. } => html! {

{ "Everyone passed" }

}, }; html! { <>
{ center }
} }