proc-macro-assertions 0.1.5

Easily create asserts on proc macro inputs
Documentation
use std::marker::PhantomData;

use sealed::sealed;

use crate::{ident_generator::IdentGenerator, store::Store};

use super::r#trait::RawAssertable;

/// Some collection of multiple asserts. One way to turn multiple [`RawAssertable`] types into one.
pub struct AssertCollection<'a, T>(T, PhantomData<&'a ()>)
where
    T: IntoIterator,
    T::Item: RawAssertable<'a>;

impl<'a, T> From<T> for AssertCollection<'a, T>
where
    T: IntoIterator,
    T::Item: RawAssertable<'a>,
{
    fn from(value: T) -> Self {
        Self(value, PhantomData)
    }
}

macro_rules! tuple_impl {
    ($i:ident | $n:tt) => {};
    (hidden $i:ident | $n:tt) => {};
    (hidden $i:ident : $($r:ident) :+ | $n:tt: $($m:tt):+) => {
        #[doc(hidden)]
        #[sealed]
        impl<'a,$i,$($r),+> super::r#trait::RawAssertable<'a> for ($i,$($r),+) where
        $i: RawAssertable<'a>,
        $($r: RawAssertable<'a>),+
        {
            fn do_raw_assert<I>(self,store: &mut Store<'a,I>)
            where
                I: IdentGenerator,
            {
                self.$n.do_raw_assert(store);
                $(self.$m.do_raw_assert(store);)*

            }
        }
      tuple_impl!(hidden $($r):+ | $($m):+);
    };
    ($i:ident : $($r:ident) :+ | $n:tt: $($m:tt):+) => {
        #[sealed]
        /// Also implemented for any tuple that is smaller.
        impl<'a,$i,$($r),+> super::r#trait::RawAssertable<'a> for ($i,$($r),+) where
        $i: RawAssertable<'a>,
        $($r: RawAssertable<'a>),+
        {
            fn do_raw_assert<I>(self,store: &mut Store<'a,I>)
            where
                I: IdentGenerator,
            {
                self.$n.do_raw_assert(store);
                $(self.$m.do_raw_assert(store);)*

            }
        }
      tuple_impl!(hidden $($r):+ | $($m):+);
    };
}

tuple_impl!(
    T0:
    T1:
    T2:
    T3:
    T4:
    T5:
    T6:
    T7:
    T8:
    T9:
    T10:
    T11:
    T12:
    T13:
    T14:
    T15:
    T16:
    T17:
    T18:
    T19:
    T20:
    T21:
    T22:
    T23:
    T24:
    T25:
    T26:
    T27:
    T28:
    T29:
    T30:
    T31 |
    31:
    30:
    29:
    28:
    27:
    26:
    25:
    24:
    23:
    22:
    21:
    20:
    19:
    18:
    17:
    16:
    15:
    14:
    13:
    12:
    11:
    10:
    9:
    8:
    7:
    6:
    5:
    4:
    3:
    2:
    1:
    0
);

#[sealed]
impl<'a, T> super::r#trait::RawAssertable<'a> for AssertCollection<'a, T>
where
    T: IntoIterator,
    T::Item: RawAssertable<'a>,
{
    fn do_raw_assert<I>(self, store: &mut Store<'a, I>)
    where
        I: IdentGenerator,
    {
        for assertable in self.0 {
            assertable.do_raw_assert(store);
        }
    }
}

#[sealed]
impl<'a, T> super::r#trait::RawAssertable<'a> for Option<T>
where
    T: RawAssertable<'a>,
{
    fn do_raw_assert<I>(self, store: &mut Store<'a, I>)
    where
        I: IdentGenerator,
    {
        if let Some(assertable) = self {
            assertable.do_raw_assert(store);
        }
    }
}