sokoban-elements 0.2.1

Parsing and writing Sokoban, Hexoban, Trioban and Octoban file formats.
Documentation
use std::error::Error;
use std::fmt::{Display, Formatter};

/// Variants of [`PieceIdError`].
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum PieceIdErrorKind {
    InvalidBoxID,
    InvalidGoalID,
    InvalidPusherID,
    InvalidPlusID,
}

/// Errors when working with [`BoxID`](crate::BoxID), [`GoalID`](crate::GoalID) and
/// [`PusherID`](crate::PusherID).
#[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
                )
            }
        }
    }
}