/ src / deck.rs
deck.rs
 1  mod card; // Declare the `card` module (located at src/deck/card.rs)
 2  pub use crate::enums::{cards::CardValue, suits::Suit}; // Import from the top-level `enums` module
 3  
 4  pub use self::card::Card; // Re-export `Card` from the `card` module
 5  
 6  #[derive(Debug, PartialEq)]
 7  pub enum DeckError {
 8      CardNotFound,
 9  }
10  
11  pub struct Deck {
12      pub cards: Vec<Card>,
13  }
14  
15  impl Deck {
16      pub fn new() -> Self {
17          let mut cards = Vec::with_capacity(52);
18          
19          for suit in Suit::all() {
20              for value in CardValue::all() {
21                  cards.push(Card {
22                      suit,
23                      value,
24                  });
25              }
26          }
27          
28          Deck { cards }
29      }
30      fn remove_at(&mut self, index: usize) -> Result<Card, DeckError> {
31          if index >= self.cards.len() {
32              Err(DeckError::CardNotFound)
33          } else {
34              Ok(self.cards.remove(index))
35          }
36      }
37      pub fn take_top(&mut self) -> Result<Card, DeckError> {
38          self.remove_at(0)
39      }
40  }