Implement part of a new Builder using the type state pattern

The API for this is much easier to use.
This commit is contained in:
Eryn Wells 2024-02-03 15:17:40 -08:00
parent f69c7d4c96
commit 0bedf2aa9f

105
moves/src/builder.rs Normal file
View file

@ -0,0 +1,105 @@
// Eryn Wells <eryn@erynwells.me>
use crate::{castle, Move};
use chessfriend_core::{PlacedPiece, Square};
pub trait Style {}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Builder<S: Style> {
style: S,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Null;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Push {
from: Option<Square>,
to: Option<Square>,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Capture {
push: Push,
capture: Option<Square>,
}
pub struct Castle {
castle: castle::Castle,
}
impl Style for Null {}
impl Style for Push {}
impl Style for Capture {}
impl Style for Castle {}
impl Builder<Null> {
pub fn new() -> Self {
Self { style: Null }
}
pub fn piece(piece: &PlacedPiece) -> Builder<Push> {
Builder {
style: Push {
from: Some(piece.square()),
to: None,
},
}
}
pub fn castling(castle: castle::Castle) -> Builder<Castle> {
Builder {
style: Castle { castle },
}
}
pub fn build(&self) -> Move {
Move(0)
}
}
impl Builder<Push> {
pub fn from(mut self, square: Square) -> Self {
self.style.from = Some(square);
self
}
pub fn to(mut self, square: Square) -> Self {
self.style.to = Some(square);
self
}
pub fn capturing(self, square: Square) -> Builder<Capture> {
Builder {
style: Capture {
push: self.style,
capture: Some(square),
},
}
}
pub fn capturing_piece(self, piece: PlacedPiece) -> Builder<Capture> {
Builder {
style: Capture {
push: self.style,
capture: Some(piece.square()),
},
}
}
}
impl Builder<Castle> {
pub fn build(&self) -> Move {
Move(self.style.into_bits())
}
}
impl Castle {
fn into_bits(&self) -> u16 {
match self.castle {
castle::Castle::KingSide => 0b10,
castle::Castle::QueenSide => 0b11,
}
}
}