crabchess 0.1.15

A simple Chess API
Documentation
//! Macros to quickly create `Square` instances.

/// Create a square from its file and rank.
/// ```
/// use crabchess::{
///     squares::{File, Rank, Square},
///     sq,
/// };
///
/// assert_eq!(sq!(C4), Square(File::C, Rank::Four));
/// ```
#[macro_export]
macro_rules! sq {
    (A1) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::A, Rank::One)
    }};
    (A2) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::A, Rank::Two)
    }};
    (A3) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::A, Rank::Three)
    }};
    (A4) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::A, Rank::Four)
    }};
    (A5) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::A, Rank::Five)
    }};
    (A6) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::A, Rank::Six)
    }};
    (A7) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::A, Rank::Seven)
    }};
    (A8) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::A, Rank::Eight)
    }};
    (B1) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::B, Rank::One)
    }};
    (B2) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::B, Rank::Two)
    }};
    (B3) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::B, Rank::Three)
    }};
    (B4) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::B, Rank::Four)
    }};
    (B5) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::B, Rank::Five)
    }};
    (B6) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::B, Rank::Six)
    }};
    (B7) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::B, Rank::Seven)
    }};
    (B8) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::B, Rank::Eight)
    }};
    (C1) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::C, Rank::One)
    }};
    (C2) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::C, Rank::Two)
    }};
    (C3) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::C, Rank::Three)
    }};
    (C4) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::C, Rank::Four)
    }};
    (C5) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::C, Rank::Five)
    }};
    (C6) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::C, Rank::Six)
    }};
    (C7) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::C, Rank::Seven)
    }};
    (C8) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::C, Rank::Eight)
    }};
    (D1) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::D, Rank::One)
    }};
    (D2) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::D, Rank::Two)
    }};
    (D3) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::D, Rank::Three)
    }};
    (D4) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::D, Rank::Four)
    }};
    (D5) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::D, Rank::Five)
    }};
    (D6) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::D, Rank::Six)
    }};
    (D7) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::D, Rank::Seven)
    }};
    (D8) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::D, Rank::Eight)
    }};
    (E1) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::E, Rank::One)
    }};
    (E2) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::E, Rank::Two)
    }};
    (E3) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::E, Rank::Three)
    }};
    (E4) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::E, Rank::Four)
    }};
    (E5) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::E, Rank::Five)
    }};
    (E6) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::E, Rank::Six)
    }};
    (E7) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::E, Rank::Seven)
    }};
    (E8) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::E, Rank::Eight)
    }};
    (F1) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::F, Rank::One)
    }};
    (F2) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::F, Rank::Two)
    }};
    (F3) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::F, Rank::Three)
    }};
    (F4) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::F, Rank::Four)
    }};
    (F5) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::F, Rank::Five)
    }};
    (F6) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::F, Rank::Six)
    }};
    (F7) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::F, Rank::Seven)
    }};
    (F8) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::F, Rank::Eight)
    }};
    (G1) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::G, Rank::One)
    }};
    (G2) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::G, Rank::Two)
    }};
    (G3) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::G, Rank::Three)
    }};
    (G4) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::G, Rank::Four)
    }};
    (G5) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::G, Rank::Five)
    }};
    (G6) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::G, Rank::Six)
    }};
    (G7) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::G, Rank::Seven)
    }};
    (G8) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::G, Rank::Eight)
    }};
    (H1) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::H, Rank::One)
    }};
    (H2) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::H, Rank::Two)
    }};
    (H3) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::H, Rank::Three)
    }};
    (H4) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::H, Rank::Four)
    }};
    (H5) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::H, Rank::Five)
    }};
    (H6) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::H, Rank::Six)
    }};
    (H7) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::H, Rank::Seven)
    }};
    (H8) => {{
        use $crate::squares::{File, Rank, Square};
        Square(File::H, Rank::Eight)
    }};
}

/// Create a vector of squares.
/// ```
/// use crabchess::{
///     squares::{File, Rank, Square},
///     sq, sqs
/// };
///
/// assert_eq!(
///     sqs![A3, B4],
///     vec![
///         Square(File::A, Rank::Three),
///         Square(File::B, Rank::Four),
///     ]
/// )
/// ```
#[macro_export]
macro_rules! sqs {
    ( $( $x:tt ),* $(,)? ) => {
        vec![
            $(
                sq!($x)
            ),*
        ]
    };
}

/// Test a move on a `ChessPosition` without actually changing its state.
///
/// # Panics
///
/// Invoking this macro will panic if the move cannot be applied to the board, i.e. if
/// `ChessPosition::apply_legal_move` returns an error.
///
/// # Example
///
/// ```
/// use crabchess::{
///     positions::{ChessPosition, moves::Move},
///     sq, pieces::Color::White, test_move
/// };
///
/// let mut position = ChessPosition::new();
/// let m = Move::read_san("Nf3", &mut position).unwrap();
///
/// let is_check = test_move!(position, m, |tp: ChessPosition| tp.is_threatened(sq!(E1), White));
///
/// assert!(!is_check);
/// ```
#[macro_export]
macro_rules! test_move {
    ( $brd:expr, $m:expr, $closure:expr ) => {{
        let mut test_board = $brd.to_hashing_position();
        test_board.apply_legal_move($m).unwrap();

        #[allow(clippy::redundant_closure_call)]
        $closure(test_board)
    }};
}