use crate::{
entity,
hlist::{
define_null,
Get,
},
query::view,
system::schedule::claim::decision,
};
define_null!();
pub struct NotPresent;
pub struct ImmutImmut;
pub struct ImmutOptionImmut;
pub struct ImmutMut;
pub struct ImmutOptionMut;
pub struct MutImmut;
pub struct MutOptionImmut;
pub struct MutMut;
pub struct MutOptionMut;
pub trait Verifier<'a, R, C, I, P> {
type Decision;
}
impl<'a, R, C> Verifier<'a, R, C, Null, Null> for view::Null {
type Decision = decision::Append;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (NotPresent, P)> for (&'a T, U)
where
R: Get<T, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = <U as Verifier<'a, R, C, IS, P>>::Decision;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (NotPresent, P)> for (&'a mut T, U)
where
R: Get<T, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = <U as Verifier<'a, R, C, IS, P>>::Decision;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (NotPresent, P)> for (Option<&'a T>, U)
where
R: Get<T, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = <U as Verifier<'a, R, C, IS, P>>::Decision;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (NotPresent, P)>
for (Option<&'a mut T>, U)
where
R: Get<T, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = <U as Verifier<'a, R, C, IS, P>>::Decision;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (ImmutImmut, P)> for (&'a T, U)
where
C: Get<&'a T, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = <U as Verifier<'a, R, C, IS, P>>::Decision;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (ImmutImmut, P)> for (Option<&'a T>, U)
where
C: Get<&'a T, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = <U as Verifier<'a, R, C, IS, P>>::Decision;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (ImmutOptionImmut, P)> for (&'a T, U)
where
C: Get<Option<&'a T>, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = <U as Verifier<'a, R, C, IS, P>>::Decision;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (ImmutOptionImmut, P)>
for (Option<&'a T>, U)
where
C: Get<Option<&'a T>, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = <U as Verifier<'a, R, C, IS, P>>::Decision;
}
impl<'a, R, C, I, U, P> Verifier<'a, R, C, I, P> for (entity::Identifier, U)
where
U: Verifier<'a, R, C, I, P>,
{
type Decision = <U as Verifier<'a, R, C, I, P>>::Decision;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (ImmutMut, P)> for (&'a T, U)
where
C: Get<&'a mut T, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = decision::Cut;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (ImmutOptionMut, P)> for (&'a T, U)
where
C: Get<Option<&'a mut T>, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = decision::Cut;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (ImmutMut, P)> for (Option<&'a T>, U)
where
C: Get<&'a mut T, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = decision::Cut;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (ImmutOptionMut, P)>
for (Option<&'a T>, U)
where
C: Get<Option<&'a mut T>, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = decision::Cut;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (MutMut, P)> for (&'a mut T, U)
where
C: Get<&'a mut T, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = decision::Cut;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (MutOptionMut, P)> for (&'a mut T, U)
where
C: Get<Option<&'a mut T>, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = decision::Cut;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (MutMut, P)> for (Option<&'a mut T>, U)
where
C: Get<&'a mut T, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = decision::Cut;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (MutOptionMut, P)>
for (Option<&'a mut T>, U)
where
C: Get<Option<&'a mut T>, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = decision::Cut;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (MutImmut, P)> for (&'a mut T, U)
where
C: Get<&'a T, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = decision::Cut;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (MutOptionImmut, P)> for (&'a mut T, U)
where
C: Get<Option<&'a T>, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = decision::Cut;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (MutImmut, P)> for (Option<&'a mut T>, U)
where
C: Get<&'a T, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = decision::Cut;
}
impl<'a, R, C, I, IS, T, U, P> Verifier<'a, R, C, (I, IS), (MutOptionImmut, P)>
for (Option<&'a mut T>, U)
where
C: Get<Option<&'a T>, I>,
U: Verifier<'a, R, C, IS, P>,
{
type Decision = decision::Cut;
}