|
1 /*** Row ****/ |
|
2 // a row of cards on the table (max 5) |
|
3 |
|
4 use std::{collections::VecDeque, mem}; |
|
5 |
|
6 use crate::card::Card; |
|
7 |
|
8 #[derive(Debug)] |
|
9 pub(crate) struct Row { |
|
10 cards: VecDeque<Card>, |
|
11 } |
|
12 |
|
13 impl Row { |
|
14 const MAX_LEN: usize = 5; |
|
15 |
|
16 pub(crate) fn new() -> Self { |
|
17 Row { |
|
18 cards: VecDeque::with_capacity(5), |
|
19 } |
|
20 } |
|
21 |
|
22 pub(crate) fn push_or_collect( &mut self, card: Card ) -> Option<VecDeque<Card>> { |
|
23 trace!("Called push_or_collect on row {:?}", &self); |
|
24 if self.cards.len() < Self::MAX_LEN { |
|
25 trace!("Less than {} cards, putting at the end", Self::MAX_LEN); |
|
26 self.cards.push_back(card); |
|
27 None |
|
28 |
|
29 } else { |
|
30 trace!("Row is full, len {}, maxlen {}", self.cards.len(), Self::MAX_LEN); |
|
31 // row overflow |
|
32 let row_cards = mem::take( &mut self.cards ); |
|
33 self.cards.push_back(card); |
|
34 if self.cards.len() != 1 { |
|
35 panic!("New row must have one card, not {}", self.cards.len()); |
|
36 } |
|
37 Some(row_cards) |
|
38 } |
|
39 } |
|
40 |
|
41 pub(crate) fn take_row( &mut self ) -> VecDeque<Card> { |
|
42 // take cards and empty the row |
|
43 mem::take( &mut self.cards ) |
|
44 } |
|
45 |
|
46 pub(crate) fn last_card_value(&self) -> i8 { |
|
47 // println!("last_card_value: cards {:?}, len {}", self.cards, self.cards.len()); |
|
48 self.cards.get( self.cards.len()-1 ).unwrap().value |
|
49 } |
|
50 |
|
51 // sum of row card points |
|
52 pub(crate) fn sum(&self) -> i32 { |
|
53 let mut sum: i32 = 0; |
|
54 self.cards.iter().for_each(|card| { |
|
55 sum += card.points as i32; |
|
56 }); |
|
57 sum |
|
58 } |
|
59 |
|
60 pub fn len(&self) -> usize { |
|
61 self.cards.len() |
|
62 } |
|
63 } |