diff options
author | eug-vs <eugene@eug-vs.xyz> | 2023-01-25 07:15:28 +0300 |
---|---|---|
committer | eug-vs <eugene@eug-vs.xyz> | 2023-01-25 07:15:28 +0300 |
commit | 8dc121b0e08cd25fab3eacde9318d7adaac1f2a4 (patch) | |
tree | a4e1af09bb368704d47e5844efc3726e71791f8d /src/board/mod.rs | |
parent | a1ad1424bcbf0fd8fff2ce9c4048e88a58934f20 (diff) | |
download | chessnost-8dc121b0e08cd25fab3eacde9318d7adaac1f2a4.tar.gz |
refactor: return recoverable errors from make_move
Diffstat (limited to 'src/board/mod.rs')
-rw-r--r-- | src/board/mod.rs | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/board/mod.rs b/src/board/mod.rs index 19c25ac..2b580b5 100644 --- a/src/board/mod.rs +++ b/src/board/mod.rs @@ -77,6 +77,11 @@ const PIECE_CHARS: [&str; 12] = [ "♙", "♘", "♗", "♖", "♕", "♔", ]; +#[derive(Debug)] +pub enum MakeMoveError { + PieceNotFound(String), +} + #[allow(unused)] impl Board { @@ -485,10 +490,9 @@ impl Board { mobility } - /// *Blindlessly* apply a move without any validation /// Move should be validated beforehand - pub fn make_move(&mut self, mov: Move) -> Option<PieceType> { + pub fn make_move(&mut self, mov: Move) -> Result<Option<PieceType>,MakeMoveError> { let move_source_bb = mov.source.to_bitboard(); let move_target_bb = mov.target.to_bitboard(); @@ -521,7 +525,11 @@ impl Board { self.hash ^= self.zobrist_seed[pawn_type * 12 + captured_square as usize]; Some(PieceType::from(pawn_type)) } - None => panic!("Pawn captured by En Passant was not found"), + None => { + return Err(MakeMoveError::PieceNotFound( + String::from("Pawn captured by En Passant was not found") + )) + } } } @@ -543,7 +551,9 @@ impl Board { }, None => { self.print(); - panic!("{:?} is malformed: source piece not found", mov); + return Err(MakeMoveError::PieceNotFound( + String::from("Source piece not found") + )) } }; @@ -617,7 +627,7 @@ impl Board { self.ply += 1; self.hash ^= self.zobrist_seed[780]; - captured_piece + Ok(captured_piece) } /// Completely reverse make_move as if it never happened |