2024-04-01 21:21:05 +02:00
|
|
|
/// A singular type for all errors that could happen during [ChessBoard::is_valid].
|
|
|
|
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
2024-04-03 21:15:17 +02:00
|
|
|
pub enum ValidationError {
|
2024-04-01 21:21:05 +02:00
|
|
|
/// Too many pieces.
|
|
|
|
TooManyPieces,
|
|
|
|
/// Missing king.
|
|
|
|
MissingKing,
|
|
|
|
/// Pawns on the first/last rank.
|
|
|
|
InvalidPawnPosition,
|
|
|
|
/// Castling rights do not match up with the state of the board.
|
|
|
|
InvalidCastlingRights,
|
2024-04-01 22:54:32 +02:00
|
|
|
/// En-passant target square is not empty, behind an opponent's pawn, on the correct rank.
|
2024-04-01 21:21:05 +02:00
|
|
|
InvalidEnPassant,
|
|
|
|
/// The two kings are next to each other.
|
|
|
|
NeighbouringKings,
|
|
|
|
/// The opponent is currently in check.
|
|
|
|
OpponentInCheck,
|
|
|
|
/// The piece-specific boards are overlapping.
|
|
|
|
OverlappingPieces,
|
|
|
|
/// The color-specific boards are overlapping.
|
|
|
|
OverlappingColors,
|
|
|
|
/// The pre-computed combined occupancy boards does not match the other boards.
|
|
|
|
ErroneousCombinedOccupancy,
|
2024-04-01 23:41:01 +02:00
|
|
|
/// Half-move clock is higher than total number of plies.
|
|
|
|
HalfMoveClockTooHigh,
|
2024-04-01 23:59:06 +02:00
|
|
|
/// The total plie count does not match the current player.
|
|
|
|
IncoherentPlieCount,
|
2024-04-01 21:21:05 +02:00
|
|
|
}
|
|
|
|
|
2024-04-03 21:15:17 +02:00
|
|
|
impl std::fmt::Display for ValidationError {
|
2024-04-01 21:21:05 +02:00
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
|
let error_msg = match self {
|
|
|
|
Self::TooManyPieces => "Too many pieces.",
|
|
|
|
Self::MissingKing => "Missing king.",
|
|
|
|
Self::InvalidPawnPosition => "Pawns on the first/last rank.",
|
|
|
|
Self::InvalidCastlingRights => {
|
|
|
|
"Castling rights do not match up with the state of the board."
|
|
|
|
}
|
|
|
|
Self::InvalidEnPassant => {
|
2024-04-01 22:54:32 +02:00
|
|
|
"En-passant target square is not empty, behind an opponent's pawn, on the correct rank."
|
2024-04-01 21:21:05 +02:00
|
|
|
}
|
|
|
|
Self::NeighbouringKings => "The two kings are next to each other.",
|
|
|
|
Self::OpponentInCheck => "The opponent is currently in check.",
|
|
|
|
Self::OverlappingPieces => "The piece-specific boards are overlapping.",
|
|
|
|
Self::OverlappingColors => "The color-specific boards are overlapping.",
|
|
|
|
Self::ErroneousCombinedOccupancy => {
|
|
|
|
"The pre-computed combined occupancy boards does not match the other boards."
|
|
|
|
}
|
2024-04-01 23:41:01 +02:00
|
|
|
Self::HalfMoveClockTooHigh => "Half-move clock is higher than total number of plies.",
|
2024-04-01 23:59:06 +02:00
|
|
|
Self::IncoherentPlieCount => "The total plie count does not match the current player.",
|
2024-04-01 21:21:05 +02:00
|
|
|
};
|
|
|
|
write!(f, "{}", error_msg)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-04-03 21:15:17 +02:00
|
|
|
impl std::error::Error for ValidationError {}
|