use thiserror::Error;
use crate::core::Position;
#[derive(Debug, Error)]
#[error("Position {position} is already occupied")]
pub struct PositionOccupiedError {
pub position: Position,
}
impl PositionOccupiedError {
pub fn new(position: Position) -> Self {
PositionOccupiedError { position }
}
}
#[derive(Debug, Error)]
#[error("Position {position} is empty")]
pub struct PositionEmptyError {
pub position: Position,
}
impl PositionEmptyError {
pub fn new(position: Position) -> Self {
PositionEmptyError { position }
}
}
#[derive(Debug, PartialEq, Error)]
#[error("Position ({col}, {row}) is out of range")]
pub struct PositionOutOfRangeError {
pub col: u8,
pub row: u8,
}
impl PositionOutOfRangeError {
pub fn new(col: u8, row: u8) -> Self {
PositionOutOfRangeError { col, row }
}
}
#[derive(Debug, PartialEq, Error)]
#[error("Invalid position: {position_str}")]
pub struct PositionInvalidError {
pub position_str: String,
}
impl PositionInvalidError {
pub fn new(position_str: String) -> Self {
PositionInvalidError { position_str }
}
}
#[derive(Debug, PartialEq, Error)]
#[error("Positions {position1} and {position2} are not aligned")]
pub struct UnalignedPositionsError {
pub position1: Position,
pub position2: Position,
}
impl UnalignedPositionsError {
pub fn new(position1: Position, position2: Position) -> Self {
UnalignedPositionsError {
position1,
position2,
}
}
}
#[non_exhaustive]
#[derive(Debug, PartialEq, Error)]
pub enum PositionBetweenError {
#[error(transparent)]
Unaligned(#[from] UnalignedPositionsError),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_position_occupied_error() {
let position = Position::from_string("a1").unwrap();
let error = PositionOccupiedError::new(position);
assert_eq!(error.position, position);
assert_eq!(format!("{}", error), "Position a1 is already occupied");
}
#[test]
fn test_position_empty_error() {
let position = Position::from_string("a1").unwrap();
let error = PositionEmptyError::new(position);
assert_eq!(error.position, position);
assert_eq!(format!("{}", error), "Position a1 is empty");
}
#[test]
fn test_position_out_of_range_error() {
let col = 8;
let row = 8;
let error = PositionOutOfRangeError::new(col, row);
assert_eq!(error.col, col);
assert_eq!(error.row, row);
assert_eq!(format!("{}", error), "Position (8, 8) is out of range");
}
#[test]
fn test_position_invalid_error() {
let position_str = "abc".to_string();
let error = PositionInvalidError::new(position_str.clone());
assert_eq!(error.position_str, position_str);
assert_eq!(format!("{}", error), "Invalid position: abc");
}
#[test]
fn test_unaligned_positions_error() {
let position1 = Position::from_string("a1").unwrap();
let position2 = Position::from_string("b3").unwrap();
let error = UnalignedPositionsError {
position1,
position2,
};
assert_eq!(error.position1, position1);
assert_eq!(error.position2, position2);
assert_eq!(format!("{}", error), "Positions a1 and b3 are not aligned");
}
}