use thiserror::Error;
#[derive(Error, Clone, Eq, PartialEq, Debug)]
pub enum ParseLevelError {
#[error("duplicate metadata with key `{0}`")]
DuplicateMetadata(String),
#[error("unterminated block comment")]
UnterminatedBlockComment,
#[error("no map data")]
NoMap,
#[error(transparent)]
ParseMapError(#[from] ParseMapError),
}
#[derive(Error, Clone, Eq, PartialEq, Debug)]
pub enum ParseMapError {
#[error("no player")]
NoPlayer,
#[error("more than one player")]
MoreThanOnePlayer,
#[error("mismatch between number of boxes and goals")]
BoxGoalMismatch,
#[error("no box or goal")]
NoBoxOrGoal,
#[error("invalid character: `{0}`")]
InvalidCharacter(char),
#[error(transparent)]
DecodeRleError(#[from] DecodeRleError),
#[error("invalid actions")]
InvalidActions,
}
#[derive(Error, Clone, Eq, PartialEq, Debug)]
pub enum ParseActionsError {
#[error(transparent)]
ParseActionError(#[from] ParseActionError),
#[error(transparent)]
DecodeRleError(#[from] DecodeRleError),
}
#[derive(Error, Clone, Eq, PartialEq, Debug)]
pub enum ParseActionError {
#[error("invalid character: `{0}`")]
InvalidCharacter(char),
}
#[derive(Error, Clone, Eq, PartialEq, Debug)]
pub enum EncodeRleError {
#[error("numeric character encountered: `{0}`")]
NumericCharacter(char),
}
#[derive(Error, Clone, Eq, PartialEq, Debug)]
pub enum DecodeRleError {
#[error("end with digits: `{0}`")]
EndWithDigits(usize),
}
#[derive(Error, Clone, Eq, PartialEq, Debug)]
pub enum SearchError {
#[error("no solution found")]
NoSolution,
}
#[derive(Error, Clone, Eq, PartialEq, Debug)]
pub enum ActionError {
#[error("movement in the specified direction is blocked")]
MoveBlocked,
#[error("push in the specified direction is blocked")]
PushBlocked,
#[error("no actions")]
NoActions,
#[error("no undone actions")]
NoUndoneActions,
}