use std::borrow::Cow;
use crate::*;
pub trait StrunemixTrait<T, U, const N: usize>
where
T: StrunemixName,
U: StrunemixData<T>
{
const FIELDS_COUNT: usize = N;
fn as_name_array() -> [T; N] {
panic!("This function should be implemented by the derive macro")
}
fn to_data_array(self) -> [U; N]
where
Self: Sized
{panic!("This function should be implemented by the derive macro")}
fn from_attr_data_array(data: [U; N]) -> Result<Self, StrunemixFromError>
where Self: TryFrom<[U; N], Error = StrunemixFromError>,
{
TryFrom::try_from(data)
}
fn to_form<A>(self) -> StrunemixForm<T, U, N, A>
where
A: Default,
T: PartialEq,
Self: Sized,
{
let names = Self::as_name_array();
let datas = self.to_data_array();
let res: StrunemixMap<T, U, N, A> = names.into_iter().zip(datas.into_iter())
.map(|(name, data)| (name, (Some(data), A::default())))
.collect();
StrunemixForm::from(res)
}
fn from_form<A>(form: StrunemixForm<T, U, N, A>) -> Result<Self, StrunemixError>
where
Self: TryFrom<[U; N], Error = StrunemixFromError>,
T: PartialEq
{
let datas = form.to_data_array()?;
Self::from_attr_data_array(datas).map_err(|e| e.into())
}
fn empty_form<A>() -> StrunemixForm<T, U, N, A>
where
A: Default,
T: PartialEq
{
let names = Self::as_name_array();
let res: StrunemixMap<T, U, N, A> = names.into_iter()
.map(|name| (name, (None, A::default())))
.collect();
StrunemixForm::from(res)
}
}
pub trait AsEnumName<T, U, const N: usize>
{
#[doc(hidden)]
fn field_of<S>(&self)-> Result<T, StrunemixFromError>
where
S: StrunemixTrait<T, U, N>,
T: StrunemixName,
U: StrunemixData<T>;
}
impl<T, U, const N: usize> AsEnumName<T, U, N> for &str
{
fn field_of<S>(&self)-> Result<T, StrunemixFromError>
where
S: StrunemixTrait<T, U, N>,
T: StrunemixName,
U: StrunemixData<T>{
<T as name::StrunemixName>::from_str(self)
}
}
impl<T, U, const N: usize> AsEnumName<T, U, N> for Cow<'_, str>
{
fn field_of<S>(&self)-> Result<T, StrunemixFromError>
where
S: StrunemixTrait<T, U, N>,
T: StrunemixName,
U: StrunemixData<T>{
<T as name::StrunemixName>::from_str(self)
}
}