use super::constants::*;
use super::errors::*;
use super::piece::*;
use super::square::*;
use super::utils::{self, *};
#[derive(Debug)]
pub struct Board {
pub _board: Vec<Square>,
}
impl Board {
pub fn new() -> Self {
Self {
_board: vec![Square { piece: None }; BOARD_SIZE],
}
}
pub fn ptr(&self) -> *const Square {
self._board.as_ptr()
}
pub fn get(&self, sq: SquareCoordinate) -> ChessResult<Option<Piece>> {
let idx = self.is_valid(sq.to_index())?;
let sq = self._board.get(idx);
if let Some(sq) = sq {
return Ok(sq.piece);
}
return Err(ChessError::InvalidIndex(idx));
}
pub fn set(
&mut self,
sq: SquareCoordinate,
piece_type: PieceType,
color: Color,
) -> ChessResult<(Piece, usize)> {
let idx = self.is_valid(sq.to_index())?;
let piece = Piece { piece_type, color };
self._board[idx].piece = Some(piece);
Ok((piece, idx))
}
pub fn remove(&mut self, sq: SquareCoordinate) -> ChessResult<()> {
let idx = self.is_valid(sq.to_index())?;
self._board[idx].piece = None;
Ok(())
}
pub fn is_valid(&self, idx: usize) -> ChessResult<usize> {
utils::is_valid(idx)
}
}