use core::fmt;
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum FenError {
FieldCount,
Placement,
SideToMove,
Castling,
EnPassant,
HalfmoveClock,
FullmoveNumber,
Position,
}
impl fmt::Display for FenError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(match self {
FenError::FieldCount => "a FEN has four or six fields",
FenError::Placement => "invalid placement field",
FenError::SideToMove => "invalid side-to-move field",
FenError::Castling => "invalid castling field",
FenError::EnPassant => "invalid en-passant field",
FenError::HalfmoveClock => "invalid halfmove clock",
FenError::FullmoveNumber => "invalid full-move number",
FenError::Position => "not a legal position",
})
}
}
impl std::error::Error for FenError {}
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum PositionError {
CastlingRights,
}
impl fmt::Display for PositionError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(match self {
PositionError::CastlingRights => "castling rights this variant cannot have",
})
}
}
impl std::error::Error for PositionError {}
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum MoveParseError {
Syntax,
Illegal,
Ambiguous,
}
impl fmt::Display for MoveParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(match self {
MoveParseError::Syntax => "malformed move text",
MoveParseError::Illegal => "no such legal move",
MoveParseError::Ambiguous => "ambiguous move text",
})
}
}
impl std::error::Error for MoveParseError {}
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct IllegalMove;
impl fmt::Display for IllegalMove {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("illegal move")
}
}
impl std::error::Error for IllegalMove {}