use core::{fmt::Display, str::FromStr};
use crate::{ConstString, Error, is_const_assignment, strip_board_pointer};
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum RemappingTarget {
BoardPointer(ConstString),
LocalPointer(ConstString),
RootPointer(ConstString),
StringAssignment(ConstString),
None(ConstString),
}
impl Display for RemappingTarget {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::BoardPointer(s) | Self::LocalPointer(s) | Self::RootPointer(s) => {
write!(f, "{{{}}}", &s)
}
Self::StringAssignment(s) | Self::None(s) => {
write!(f, "{}", &s)
}
}
}
}
impl FromStr for RemappingTarget {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
strip_board_pointer(s).map_or_else(
|| {
if is_const_assignment(s) {
Ok(Self::StringAssignment(s.into()))
} else {
Err(Error::CreateRemapping { source: s.into() })
}
},
|board_pointer| Ok(Self::BoardPointer(board_pointer.into())),
)
}
}
#[cfg(test)]
mod tests {
use super::*;
const fn is_normal<T: Sized + Send + Sync>() {}
#[test]
const fn normal_types() {
is_normal::<RemappingTarget>();
}
}