diff --git a/board/src/lib.rs b/board/src/lib.rs index ad79c14..34f38df 100644 --- a/board/src/lib.rs +++ b/board/src/lib.rs @@ -4,6 +4,7 @@ mod bitboard; mod moves; #[macro_use] pub mod piece; +#[macro_use] pub mod position; mod square; diff --git a/board/src/position/position.rs b/board/src/position/position.rs index 2fa2360..7c8d75c 100644 --- a/board/src/position/position.rs +++ b/board/src/position/position.rs @@ -18,6 +18,15 @@ pub(crate) enum BoardSide { Queen, } +#[macro_export] +macro_rules! position { + [$($color:ident $shape:ident on $square:ident,)*] => { + Position::from_iter([ + $(piece!($color $shape on $square)),* + ].into_iter()) + }; +} + #[derive(Clone, Eq, Hash, PartialEq)] pub struct Position { color_to_move: Color, @@ -199,6 +208,17 @@ impl Default for Position { } } +impl FromIterator for Position { + fn from_iter>(iter: T) -> Self { + let mut position = Position::empty(); + for placed_piece in iter { + _ = position.place_piece(placed_piece.piece(), placed_piece.square()); + } + + position + } +} + impl fmt::Debug for Position { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let mut output = String::new();