update interface for illegal positions
This commit is contained in:
parent
d8f9be3b2c
commit
0d8b9cc9cf
2 changed files with 15 additions and 25 deletions
38
src/setup.rs
38
src/setup.rs
|
|
@ -542,8 +542,8 @@ impl std::error::Error for ParseSetupError {}
|
|||
/// This is an illegal position that can't be represented with the [`Position`] type.
|
||||
#[derive(Debug)]
|
||||
pub struct IllegalPosition {
|
||||
setup: Setup,
|
||||
reasons: IllegalPositionReasons,
|
||||
pub setup: Setup,
|
||||
pub reasons: IllegalPositionReasons,
|
||||
}
|
||||
impl std::fmt::Display for IllegalPosition {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
|
|
@ -556,30 +556,14 @@ impl std::fmt::Display for IllegalPosition {
|
|||
f.write_char(',')?;
|
||||
}
|
||||
first = false;
|
||||
write!(f, " {reason}")?;
|
||||
f.write_char(' ')?;
|
||||
f.write_str(reason.to_str())?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
impl std::error::Error for IllegalPosition {}
|
||||
|
||||
impl IllegalPosition {
|
||||
/// Returns an iterator over the reasons why the position is rejected.
|
||||
pub fn reasons(&self) -> IllegalPositionReasons {
|
||||
self.reasons
|
||||
}
|
||||
|
||||
/// Returns the [`Setup`] that failed validation.
|
||||
pub fn as_setup(&self) -> &Setup {
|
||||
&self.setup
|
||||
}
|
||||
|
||||
/// Returns the [`Setup`] that failed validation.
|
||||
pub fn into_setup(self) -> Setup {
|
||||
self.setup
|
||||
}
|
||||
}
|
||||
|
||||
/// A set of [`IllegalPositionReason`]s.
|
||||
#[derive(Clone, Copy)]
|
||||
pub struct IllegalPositionReasons(u8);
|
||||
|
|
@ -650,9 +634,9 @@ pub enum IllegalPositionReason {
|
|||
ImpossibleEnPassantPin = 128,
|
||||
}
|
||||
|
||||
impl std::fmt::Display for IllegalPositionReason {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.write_str(match self {
|
||||
impl IllegalPositionReason {
|
||||
fn to_str(self) -> &'static str {
|
||||
match self {
|
||||
Self::MissingKing => "missing king",
|
||||
Self::TooManyKings => "too many kings",
|
||||
Self::HangingKing => "hanging king",
|
||||
|
|
@ -661,6 +645,12 @@ impl std::fmt::Display for IllegalPositionReason {
|
|||
Self::InvalidEnPassant => "invalid en passant",
|
||||
Self::TooMuchMaterial => "too much material",
|
||||
Self::ImpossibleEnPassantPin => "illegal en passant",
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Display for IllegalPositionReason {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.write_str(self.to_str())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -200,7 +200,7 @@ fn setup() {
|
|||
.parse::<Setup>()
|
||||
.unwrap()
|
||||
.into_position()
|
||||
.is_err_and(|e| e.reasons().contains(reason)),
|
||||
.is_err_and(|e| e.reasons.contains(reason)),
|
||||
"{record} should be invalid because of {reason:?}",
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue