summaryrefslogtreecommitdiff
path: root/webapp/src/bridge_engine.rs
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2022-09-06 21:00:00 -0400
committerKjetil Orbekk <kj@orbekk.com>2022-09-06 21:00:00 -0400
commit397214caf0fe46cb1cd455908a67d36a931e7ec4 (patch)
tree943cab72b679c069f93744e0bd91eba059318652 /webapp/src/bridge_engine.rs
parent6f2dbd6db9836b5b60c78ec457b07d1202527690 (diff)
Finish bidding table component
Diffstat (limited to 'webapp/src/bridge_engine.rs')
-rw-r--r--webapp/src/bridge_engine.rs32
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);