use crate::board::{Action, Position};
use thiserror::Error;
#[derive(Debug, Clone, Error)]
pub enum BitBoardError {
#[error("Position is not available for placing pieces: {0:#x}")]
PositionOccupied(u32),
#[error("Empty position at bit position: {0:#x}")]
EmptyPosition(u32),
#[error("Invalid move from {from:#x} to {to:#x}")]
InvalidMove { from: u32, to: u32 },
}
#[derive(Debug, Clone, Error)]
pub enum BoardError {
#[error("Position already occupied: {0:?}")]
PositionOccupied(Position),
#[error("Empty position: {0:?}")]
EmptyPosition(Position),
#[error("Invalid move from {from:?} to {to:?}")]
InvalidMove { from: Position, to: Position },
#[error(transparent)]
BitBoardError(#[from] BitBoardError),
}
#[derive(Debug, Clone, Error)]
pub enum GameError {
#[error("Illegal action: {0:?}")]
IllegalAction(Action),
#[error("Cannot declare second best")]
CannotDeclareSecondBest,
#[error("Game is already over")]
GameAlreadyOver,
#[error(transparent)]
BoardError(#[from] BoardError),
}
#[derive(Debug, Clone, Error)]
pub enum Error {
#[error(transparent)]
Game(#[from] GameError),
#[error(transparent)]
Board(#[from] BoardError),
#[error(transparent)]
BitBoard(#[from] BitBoardError),
#[error("Position error: {0}")]
Position(u32),
#[error("Other error: {0}")]
Other(String),
}