use core::fmt;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum CastleRightsParseError {
InvalidChar(char),
InvalidDashUsage,
}
impl fmt::Display for CastleRightsParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
CastleRightsParseError::InvalidChar(ch) => {
write!(f, "invalid castling character '{}'", ch)
}
CastleRightsParseError::InvalidDashUsage => {
write!(f, "'-' must be the only character in castling rights")
}
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BoardParseError {
FenTooShort,
MissingSideToMove,
MissingCastlingRights,
MissingEnPassant,
MissingHalfmoveClock,
MissingFullmoveNumber,
InvalidRowLength,
InvalidBoardLayout,
InvalidPiece(PieceParseError),
InvalidSideToMove,
InvalidCastlingRights(CastleRightsParseError),
InvalidEnPassantSquare(SquareParseError),
InvalidEnPassantRank,
InvalidHalfmoveClock,
HalfmoveClockOverflow,
InvalidFullmoveNumber,
FullmoveMustBePositive,
}
impl fmt::Display for BoardParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BoardParseError::FenTooShort => f.write_str("FEN string is too short"),
BoardParseError::MissingSideToMove => f.write_str("Missing side to move in FEN"),
BoardParseError::MissingCastlingRights => f.write_str("Missing castling rights in FEN"),
BoardParseError::MissingEnPassant => f.write_str("Missing en passant square in FEN"),
BoardParseError::MissingHalfmoveClock => f.write_str("Missing halfmove clock in FEN"),
BoardParseError::MissingFullmoveNumber => f.write_str("Missing fullmove number in FEN"),
BoardParseError::InvalidRowLength => {
f.write_str("A FEN rank does not contain exactly 8 squares")
}
BoardParseError::InvalidBoardLayout => f.write_str("Invalid board layout in FEN"),
BoardParseError::InvalidPiece(err) => {
write!(f, "{}", err)
}
BoardParseError::InvalidSideToMove => {
f.write_str("Invalid side to move (expected 'w' or 'b')")
}
BoardParseError::InvalidCastlingRights(err) => {
write!(f, "Invalid castling rights: {}", err)
}
BoardParseError::InvalidEnPassantSquare(err) => {
write!(f, "{}", err)
}
BoardParseError::InvalidEnPassantRank => {
f.write_str("Invalid en passant rank (must be rank 3 or 6)")
}
BoardParseError::InvalidHalfmoveClock => f.write_str("Invalid halfmove clock value"),
BoardParseError::HalfmoveClockOverflow => {
f.write_str("Halfmove clock exceeds the maximum allowed value (100)")
}
BoardParseError::InvalidFullmoveNumber => f.write_str("Invalid fullmove number value"),
BoardParseError::FullmoveMustBePositive => {
f.write_str("Fullmove number must be greater than zero")
}
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum PieceParseError {
InvalidChar(char),
}
impl fmt::Display for PieceParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
PieceParseError::InvalidChar(c) => {
write!(f, "Invalid piece character '{}'", c)
}
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum SquareParseError {
InvalidLength,
InvalidName,
}
impl fmt::Display for SquareParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SquareParseError::InvalidLength => {
write!(f, "Invalid square length (expected exactly 2 characters)")
}
SquareParseError::InvalidName => write!(f, "Invalid square name"),
}
}
}