diff --git a/src/lib.rs b/src/lib.rs index d5394eb..9e2d1d0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -95,6 +95,11 @@ impl Board { } else { &mut self.black }; + let nonmover = if self.white_to_move { + &mut self.black + } else { + &mut self.white + }; if algebra == "O-O" || algebra == "0-0" { mover @@ -118,27 +123,53 @@ impl Board { .find(|lp| lp.piece == Piece::Rook && lp.file == 0) .unwrap() .file = 3; - } + } else { + let first_char = algebra.chars().next().unwrap(); + let piece = if first_char.is_ascii_uppercase() { + match first_char { + 'R' => Piece::Rook, + 'N' => Piece::Knight, + 'B' => Piece::Bishop, + 'K' => Piece::King, + 'Q' => Piece::Queen, + _ => unreachable!(), + } + } else { + Piece::Pawn + }; - let first_char = algebra.chars().next().unwrap(); - let piece = if first_char.is_ascii_uppercase() { - match first_char { - 'R' => Piece::Rook, - 'N' => Piece::Knight, - 'B' => Piece::Bishop, - 'K' => Piece::King, - 'Q' => Piece::Queen, - _ => unreachable!(), + if (piece == Piece::Pawn) { + let file = first_char as usize; + let rank = algebra.chars().nth(1).unwrap() as usize - 'a' as usize; + if algebra.len() == 2 { + nonmover.retain(|lp| lp.rank != rank && lp.file != file); + mover + .iter_mut() + .find(|lp| { + lp.file == file + && lp.piece == Piece::Pawn + && self.valid_moves(lp).includes((rank, file)) + }) + .unwrap() + .rank = rank; + } } - } else { - Piece::Pawn - }; - let destination_square = todo!(); - todo!() + let destination_square = todo!(); + todo!() + } } } +#[derive(Clone, Copy, PartialEq, Eq)] +enum MoveSegment { + Piece(Piece), + Rank(usize), + File(usize), + Captures, + Promotion(Piece), +} + #[cfg(test)] mod tests { use super::*;