use core::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Direction {
North,
NorthEast,
East,
SouthEast,
South,
SouthWest,
West,
NorthWest,
}
impl Direction {
pub const ALL: [Direction; 8] = [
Direction::North,
Direction::NorthEast,
Direction::East,
Direction::SouthEast,
Direction::South,
Direction::SouthWest,
Direction::West,
Direction::NorthWest,
];
pub fn offset(self) -> (i32, i32) {
match self {
Direction::North => (0, 1),
Direction::NorthEast => (1, 1),
Direction::East => (1, 0),
Direction::SouthEast => (1, -1),
Direction::South => (0, -1),
Direction::SouthWest => (-1, -1),
Direction::West => (-1, 0),
Direction::NorthWest => (-1, 1),
}
}
pub fn opposite(self) -> Self {
match self {
Direction::North => Direction::South,
Direction::NorthEast => Direction::SouthWest,
Direction::East => Direction::West,
Direction::SouthEast => Direction::NorthWest,
Direction::South => Direction::North,
Direction::SouthWest => Direction::NorthEast,
Direction::West => Direction::East,
Direction::NorthWest => Direction::SouthEast,
}
}
}
impl fmt::Display for Direction {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match self {
Direction::North => "North",
Direction::NorthEast => "NorthEast",
Direction::East => "East",
Direction::SouthEast => "SouthEast",
Direction::South => "South",
Direction::SouthWest => "SouthWest",
Direction::West => "West",
Direction::NorthWest => "NorthWest",
};
write!(f, "{s}")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_offset() {
assert_eq!(Direction::North.offset(), (0, 1));
assert_eq!(Direction::East.offset(), (1, 0));
assert_eq!(Direction::SouthWest.offset(), (-1, -1));
}
#[test]
fn test_opposite() {
assert_eq!(Direction::North.opposite(), Direction::South);
assert_eq!(Direction::East.opposite(), Direction::West);
assert_eq!(Direction::NorthEast.opposite(), Direction::SouthWest);
}
}