diff --git a/Cargo.lock b/Cargo.lock index 64361ce..35dd1a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -125,6 +125,13 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "klondike-cli" +version = "0.1.0" +dependencies = [ + "card_game", +] + [[package]] name = "leb128fmt" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..046c6f2 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[workspace] +members = [ + "card_game", + "klondike-cli", +] +resolver = "3" diff --git a/klondike-cli/Cargo.toml b/klondike-cli/Cargo.toml new file mode 100644 index 0000000..eac80b9 --- /dev/null +++ b/klondike-cli/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "klondike-cli" +version = "0.1.0" +edition = "2024" + +[dependencies] +card_game = { version = "0.1.0", path = "../card_game" } diff --git a/card_game/src/main.rs b/klondike-cli/src/main.rs similarity index 86% rename from card_game/src/main.rs rename to klondike-cli/src/main.rs index 1716468..a88f70b 100644 --- a/card_game/src/main.rs +++ b/klondike-cli/src/main.rs @@ -1,26 +1,22 @@ -mod card_game; -mod klondike; - -pub type Rng = rand::rngs::ThreadRng; - -use card_game::{Card, Game, Pile, Session, Suit}; -use klondike::{ +use card_game::card_game::{Card, Game, Pile, Session, Suit}; +use card_game::klondike::{ DstFoundation, DstTableau, Foundation, Klondike, KlondikeInstruction, KlondikePile, KlondikePileStack, SkipCards, Tableau, TableauStack, }; use std::fmt::Display; +struct Displayed(T); -impl Display for Card { +impl Display for Displayed<&Card> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self.value().get() { + match self.0.value().get() { 1 => write!(f, "A"), 11 => write!(f, "J"), 12 => write!(f, "Q"), 13 => write!(f, "K"), other => write!(f, "{other}"), }?; - match self.suit() { + match self.0.suit() { Suit::Spades => write!(f, "♠"), Suit::Hearts => write!(f, "♡"), Suit::Clubs => write!(f, "♣"), @@ -33,30 +29,30 @@ struct OptionalCard<'a>(Option<&'a Card>); impl Display for OptionalCard<'_> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - OptionalCard(Some(card)) => write!(f, "{card}"), + &OptionalCard(Some(card)) => write!(f, "{}", Displayed(card)), OptionalCard(None) => write!(f, "None"), } } } -impl Display for Klondike { +impl Display for Displayed<&Klondike> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { // Stock - let stock_count = self.state().stock().face_down().len(); + let stock_count = self.0.state().stock().face_down().len(); writeln!(f, "Stock: {stock_count}")?; // Hand - let hand = self.state().stock().face_up().last(); + let hand = self.0.state().stock().face_up().last(); writeln!(f, "Hand: {}", OptionalCard(hand))?; // Foundations write!( f, "Foundations: {} {} {} {}", - OptionalCard(self.state().foundation1().last()), - OptionalCard(self.state().foundation2().last()), - OptionalCard(self.state().foundation3().last()), - OptionalCard(self.state().foundation4().last()), + OptionalCard(self.0.state().foundation1().last()), + OptionalCard(self.0.state().foundation2().last()), + OptionalCard(self.0.state().foundation3().last()), + OptionalCard(self.0.state().foundation4().last()), )?; writeln!(f)?; @@ -70,18 +66,18 @@ impl Display for Klondike { write!(f, "]")?; } for card in pile.face_up() { - write!(f, "{card}")?; + write!(f, "{}", Displayed(card))?; } writeln!(f)?; Ok(()) } - write_pile(f, self.state().tableau1(), 1)?; - write_pile(f, self.state().tableau2(), 2)?; - write_pile(f, self.state().tableau3(), 3)?; - write_pile(f, self.state().tableau4(), 4)?; - write_pile(f, self.state().tableau5(), 5)?; - write_pile(f, self.state().tableau6(), 6)?; - write_pile(f, self.state().tableau7(), 7)?; + write_pile(f, self.0.state().tableau1(), 1)?; + write_pile(f, self.0.state().tableau2(), 2)?; + write_pile(f, self.0.state().tableau3(), 3)?; + write_pile(f, self.0.state().tableau4(), 4)?; + write_pile(f, self.0.state().tableau5(), 5)?; + write_pile(f, self.0.state().tableau6(), 6)?; + write_pile(f, self.0.state().tableau7(), 7)?; Ok(()) } @@ -203,7 +199,7 @@ fn main() -> Result<(), std::io::Error> { let mut session = Session::new(Klondike::new_random_default()); loop { // display game - println!("{}", session.state()); + println!("{}", Displayed(session.state())); // parse input let mut input = String::new();