11use pyo3:: { pyclass, pymethods, PyErr } ;
22
3- use crate :: plugin:: { errors:: HUIError , field:: Field , game_state:: GameState } ;
3+ use crate :: plugin:: { errors:: HUIError , field:: Field , game_state:: GameState , hare :: Hare } ;
44
55use super :: card:: Card ;
66
@@ -28,21 +28,44 @@ impl Advance {
2828
2929 let current_field = state. board . get_field ( player. position ) . unwrap ( ) ;
3030 if self . cards . is_empty ( ) {
31- match current_field {
32- Field :: Market | Field :: Hare => {
33- return Err ( HUIError :: new_err ( "Cannot enter field without any cards" ) ) ;
34- }
35- _ => {
36- state. update_player ( player) ;
37- return Ok ( ( ) ) ;
38- }
31+ return self . handle_empty_cards ( current_field, state, player) ;
32+ }
33+
34+ self . handle_cards ( current_field, state, player)
35+ }
36+
37+ fn handle_empty_cards (
38+ & self ,
39+ current_field : Field ,
40+ state : & mut GameState ,
41+ player : Hare ,
42+ ) -> Result < ( ) , PyErr > {
43+ match current_field {
44+ Field :: Market | Field :: Hare => {
45+ Err ( HUIError :: new_err ( "Cannot enter field without any cards" ) )
46+ }
47+ _ => {
48+ state. update_player ( player) ;
49+ Ok ( ( ) )
3950 }
4051 }
52+ }
4153
54+ fn handle_cards (
55+ & self ,
56+ mut current_field : Field ,
57+ state : & mut GameState ,
58+ mut player : Hare ,
59+ ) -> Result < ( ) , PyErr > {
4260 let mut last_card: Option < & Card > = None ;
4361 let mut card_bought = false ;
4462
45- for card in & self . cards {
63+ for ( index, card) in self . cards . iter ( ) . enumerate ( ) {
64+ let remaining_cards = self
65+ . cards
66+ . get ( index + 1 ..)
67+ . map ( |slice| slice. to_vec ( ) )
68+ . unwrap_or ( Vec :: new ( ) ) ;
4669 match current_field {
4770 Field :: Market if card_bought => {
4871 return Err ( HUIError :: new_err ( "Only one card allowed to buy" ) ) ;
@@ -60,18 +83,20 @@ impl Advance {
6083 }
6184
6285 last_card = Some ( card) ;
63- let mut remaining_cards = self . cards . clone ( ) ;
64-
65- if let Some ( position) = remaining_cards. iter ( ) . position ( |c| c == card) {
66- remaining_cards. remove ( position) ;
67- } else {
68- return Err ( HUIError :: new_err ( "Card not in list of cards" ) ) ?;
69- }
7086
71- card. perform ( state, remaining_cards) ?;
87+ card. perform ( state, remaining_cards. clone ( ) ) ?;
88+ player = state. clone_current_player ( ) ;
7289 }
7390 _ => Err ( HUIError :: new_err ( "Card cannot be played on this field" ) ) ?,
7491 }
92+
93+ current_field = state. board . get_field ( player. position ) . unwrap ( ) ;
94+ if current_field == Field :: Hare && remaining_cards. is_empty ( ) && last_card. is_none ( ) {
95+ return Err ( HUIError :: new_err ( "Cannot enter field without any cards" ) ) ;
96+ }
97+ if current_field == Field :: Market && remaining_cards. is_empty ( ) && !card_bought {
98+ return Err ( HUIError :: new_err ( "Cannot enter field without any cards" ) ) ;
99+ }
75100 }
76101
77102 state. update_player ( player) ;
0 commit comments