diff options
Diffstat (limited to 'webapp/src/bridge_engine.rs')
| -rw-r--r-- | webapp/src/bridge_engine.rs | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/webapp/src/bridge_engine.rs b/webapp/src/bridge_engine.rs index 702faa9..573b2f1 100644 --- a/webapp/src/bridge_engine.rs +++ b/webapp/src/bridge_engine.rs @@ -143,6 +143,18 @@ impl fmt::Debug for Bid { } } +impl FromStr for Bid { + type Err = anyhow::Error; + fn from_str(s: &str) -> std::result::Result<Self, <Self as std::str::FromStr>::Err> { + match s.trim().to_ascii_lowercase().as_str() { + "pass" => Ok(Bid::Pass), + "double" => Ok(Bid::Double), + "redouble" => Ok(Bid::Redouble), + x => Ok(Bid::Raise(x.parse()?)), + } + } +} + #[derive(PartialEq, Eq, Clone, Copy)] pub struct Raise { pub level: ContractLevel, @@ -216,7 +228,7 @@ impl FromStr for Raise { let caps = RE.captures(s).ok_or(anyhow!("invalid raise: {}", s))?; debug!("caps: {:?}", caps); let level = caps[1].parse()?; - let suit = match &caps[2] { + let suit = match caps[2].to_ascii_uppercase().as_str() { "NT" => None, x => Some(x.parse()?), }; @@ -224,14 +236,14 @@ impl FromStr for Raise { } } -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, PartialEq, Eq, Copy, Clone)] pub enum ContractModifier { None, Doubled, Redoubled, } -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, PartialEq, Eq, Copy, Clone)] pub struct Contract { highest_bid: Option<Raise>, modifier: ContractModifier, @@ -295,12 +307,21 @@ impl Bidding { } } -#[derive(Debug)] +#[derive(Debug, Clone)] pub enum BiddingResult { InProgress(Bidding), Contract(Contract, Bidding), } +impl BiddingResult { + pub fn bidding(self) -> Bidding { + match self { + BiddingResult::InProgress(bidding) => bidding, + BiddingResult::Contract(_, bidding) => bidding, + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -349,9 +370,12 @@ mod tests { assert_eq!("1♢", format!("{:?}", bid1d)); assert_eq!(bid1d, Raise::from_str("1D").unwrap()); + assert_eq!(Bid::Pass, Bid::from_str("pass").unwrap()); + let mut checked_raises = 0; for bid in Raise::all_raises() { assert_eq!(bid, Raise::from_str(format!("{}", bid).as_str()).unwrap()); + assert_eq!(Bid::Raise(bid), Bid::from_str(format!("{}", bid).as_str()).unwrap()); checked_raises += 1; } assert_eq!(checked_raises, 35); |
