[position] Rename FenError → ToFenError
Add an associated type called Error to the ToFen trait. This mirrors the try_from any try_into traits.
This commit is contained in:
parent
808526f8f7
commit
77f419ad3b
1 changed files with 24 additions and 15 deletions
|
@ -5,16 +5,19 @@ use chessfriend_core::{Color, File, Piece, PlacedPiece, Rank, Square};
|
||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||||
pub enum FenError {
|
pub enum ToFenError {
|
||||||
FmtError(std::fmt::Error),
|
FmtError(std::fmt::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait ToFen {
|
pub trait ToFen {
|
||||||
fn to_fen(&self) -> Result<String, FenError>;
|
type Error;
|
||||||
|
fn to_fen(&self) -> Result<String, Self::Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToFen for Position {
|
impl ToFen for Position {
|
||||||
fn to_fen(&self) -> Result<String, FenError> {
|
type Error = ToFenError;
|
||||||
|
|
||||||
|
fn to_fen(&self) -> Result<String, Self::Error> {
|
||||||
let mut fen_string = String::new();
|
let mut fen_string = String::new();
|
||||||
|
|
||||||
let mut empty_squares: u8 = 0;
|
let mut empty_squares: u8 = 0;
|
||||||
|
@ -25,27 +28,27 @@ impl ToFen for Position {
|
||||||
Some(piece) => {
|
Some(piece) => {
|
||||||
if empty_squares > 0 {
|
if empty_squares > 0 {
|
||||||
write!(fen_string, "{}", empty_squares)
|
write!(fen_string, "{}", empty_squares)
|
||||||
.map_err(|err| FenError::FmtError(err))?;
|
.map_err(|err| ToFenError::FmtError(err))?;
|
||||||
empty_squares = 0;
|
empty_squares = 0;
|
||||||
}
|
}
|
||||||
write!(fen_string, "{}", piece.to_fen()?)
|
write!(fen_string, "{}", piece.to_fen()?)
|
||||||
.map_err(|err| FenError::FmtError(err))?;
|
.map_err(|err| ToFenError::FmtError(err))?;
|
||||||
}
|
}
|
||||||
None => empty_squares += 1,
|
None => empty_squares += 1,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if empty_squares > 0 {
|
if empty_squares > 0 {
|
||||||
write!(fen_string, "{}", empty_squares).map_err(|err| FenError::FmtError(err))?;
|
write!(fen_string, "{}", empty_squares).map_err(|err| ToFenError::FmtError(err))?;
|
||||||
empty_squares = 0;
|
empty_squares = 0;
|
||||||
}
|
}
|
||||||
if rank != &Rank::ONE {
|
if rank != &Rank::ONE {
|
||||||
write!(fen_string, "/").map_err(|err| FenError::FmtError(err))?;
|
write!(fen_string, "/").map_err(|err| ToFenError::FmtError(err))?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
write!(fen_string, " {}", self.player_to_move().to_fen()?)
|
write!(fen_string, " {}", self.player_to_move().to_fen()?)
|
||||||
.map_err(|err| FenError::FmtError(err))?;
|
.map_err(|err| ToFenError::FmtError(err))?;
|
||||||
|
|
||||||
let castling = [
|
let castling = [
|
||||||
(Color::White, Castle::KingSide),
|
(Color::White, Castle::KingSide),
|
||||||
|
@ -73,7 +76,7 @@ impl ToFen for Position {
|
||||||
" {}",
|
" {}",
|
||||||
if castling.len() > 0 { &castling } else { "-" }
|
if castling.len() > 0 { &castling } else { "-" }
|
||||||
)
|
)
|
||||||
.map_err(|err| FenError::FmtError(err))?;
|
.map_err(|err| ToFenError::FmtError(err))?;
|
||||||
|
|
||||||
write!(
|
write!(
|
||||||
fen_string,
|
fen_string,
|
||||||
|
@ -84,17 +87,19 @@ impl ToFen for Position {
|
||||||
"-".to_string()
|
"-".to_string()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
.map_err(|err| FenError::FmtError(err))?;
|
.map_err(|err| ToFenError::FmtError(err))?;
|
||||||
|
|
||||||
write!(fen_string, " {}", self.ply_counter()).map_err(|err| FenError::FmtError(err))?;
|
write!(fen_string, " {}", self.ply_counter()).map_err(|err| ToFenError::FmtError(err))?;
|
||||||
write!(fen_string, " {}", self.move_number()).map_err(|err| FenError::FmtError(err))?;
|
write!(fen_string, " {}", self.move_number()).map_err(|err| ToFenError::FmtError(err))?;
|
||||||
|
|
||||||
Ok(fen_string)
|
Ok(fen_string)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToFen for Color {
|
impl ToFen for Color {
|
||||||
fn to_fen(&self) -> Result<String, FenError> {
|
type Error = ToFenError;
|
||||||
|
|
||||||
|
fn to_fen(&self) -> Result<String, Self::Error> {
|
||||||
match self {
|
match self {
|
||||||
Color::White => Ok("w".to_string()),
|
Color::White => Ok("w".to_string()),
|
||||||
Color::Black => Ok("b".to_string()),
|
Color::Black => Ok("b".to_string()),
|
||||||
|
@ -103,7 +108,9 @@ impl ToFen for Color {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToFen for Piece {
|
impl ToFen for Piece {
|
||||||
fn to_fen(&self) -> Result<String, FenError> {
|
type Error = ToFenError;
|
||||||
|
|
||||||
|
fn to_fen(&self) -> Result<String, Self::Error> {
|
||||||
let ascii: char = self.to_ascii();
|
let ascii: char = self.to_ascii();
|
||||||
Ok(String::from(match self.color() {
|
Ok(String::from(match self.color() {
|
||||||
Color::White => ascii.to_ascii_uppercase(),
|
Color::White => ascii.to_ascii_uppercase(),
|
||||||
|
@ -113,7 +120,9 @@ impl ToFen for Piece {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToFen for PlacedPiece {
|
impl ToFen for PlacedPiece {
|
||||||
fn to_fen(&self) -> Result<String, FenError> {
|
type Error = ToFenError;
|
||||||
|
|
||||||
|
fn to_fen(&self) -> Result<String, Self::Error> {
|
||||||
Ok(self.piece().to_fen()?)
|
Ok(self.piece().to_fen()?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue