use std::error::Error;
use std::fmt::{Display, Formatter};
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum PieceIdErrorKind {
InvalidBoxID,
InvalidGoalID,
InvalidPusherID,
InvalidPlusID,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct PieceIdError {
pub kind: PieceIdErrorKind,
pub value: String,
}
impl PieceIdError {
pub fn kind(&self) -> PieceIdErrorKind { self.kind }
}
impl Error for PieceIdError {}
impl Display for PieceIdError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match &self.kind {
PieceIdErrorKind::InvalidBoxID => {
write!(
f,
"invalid value {} for BoxID, must be in range 0 .. BoxID::MAX",
self.value
)
}
PieceIdErrorKind::InvalidGoalID => {
write!(
f,
"invalid value {} for GoalID, must be in range 0 .. GoalID::MAX",
self.value
)
}
PieceIdErrorKind::InvalidPusherID => {
write!(
f,
"invalid value {} for PusherID, must be in range 0 .. PusherID::MAX",
self.value
)
}
PieceIdErrorKind::InvalidPlusID => {
write!(
f,
"invalid value {} for PlusID, must be in range 1 .. u16::MAX",
self.value
)
}
}
}
}