rg-chess 0.2.4

Chess Game with graphical interface.
Documentation
/// Describe 8 directions.
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum Direction {
    Up,
    UpRight,
    Right,
    DownRight,
    Down,
    DownLeft,
    Left,
    UpLeft,
}

/// Numbers of line (vertical and horizontal).
pub const NUM_LINES: usize = 4;

/// Enumerate All [`Direction`] in line (vertical and horizontal).
pub const ALL_LINE: [Direction; NUM_LINES] = [
    Direction::Up,
    Direction::Right,
    Direction::Down,
    Direction::Left,
];

/// Numbers of diagonal.
pub const NUM_DIAGONAL: usize = 4;

/// Enumerate all [`Direction`] in diagonal.
pub const ALL_DIAGONAL: [Direction; NUM_DIAGONAL] = [
    Direction::UpRight,
    Direction::DownRight,
    Direction::DownLeft,
    Direction::UpLeft,
];

/// Numbers of [`Direction`].
pub const NUM_DIRECTION: usize = NUM_LINES + NUM_DIAGONAL;

/// Enumerate all [`Direction`].
pub const ALL_DIRECTION: [Direction; NUM_DIRECTION] = [
    Direction::Up,
    Direction::UpRight,
    Direction::Right,
    Direction::DownRight,
    Direction::Down,
    Direction::DownLeft,
    Direction::Left,
    Direction::UpLeft,
];

impl Direction {
    /// Verify if a direction is contain in another.
    ///
    /// # Examples
    ///
    /// ```
    /// use chess::Direction;
    ///
    /// assert_eq!(Direction::Up.has(Direction::Up), true);
    /// assert_eq!(Direction::Up.has(Direction::Right), false);
    /// assert_eq!(Direction::UpRight.has(Direction::Up), true);
    /// assert_eq!(Direction::UpRight.has(Direction::Right), true);
    /// // but it's not symmetric
    /// assert_eq!(Direction::Up.has(Direction::UpRight), false);
    /// ```
    pub fn has(&self, direction: Direction) -> bool {
        if *self == direction {
            return true;
        }
        match *self {
            Direction::UpRight => matches!(direction, Direction::Up | Direction::Right),
            Direction::DownRight => matches!(direction, Direction::Down | Direction::Right),
            Direction::DownLeft => matches!(direction, Direction::Down | Direction::Left),
            Direction::UpLeft => matches!(direction, Direction::Up | Direction::Left),
            _ => false,
        }
    }
}