vyre-primitives 0.4.1

Compositional primitives for vyre — marker types (always on) + Tier 2.5 LEGO substrate (feature-gated per domain).
Documentation
use std::fmt::Debug;
use std::panic::{catch_unwind, UnwindSafe};

pub(crate) fn assert_unwind_or_eq<T, F>(run: F, expected: T, message: &str)
where
    T: Debug + PartialEq,
    F: FnOnce() -> T + UnwindSafe,
{
    if let Ok(actual) = catch_unwind(run) {
        assert_eq!(actual, expected, "{message}");
    }
}

macro_rules! adversarial_unary_vec_cases {
    ($($name:ident: $input:expr => $expected:expr, $message:literal;)*) => {
        $(
            #[test]
            fn $name() {
                let input: Vec<u32> = $input;
                $crate::common::assert_unwind_or_eq(|| cpu_ref(&input), $expected, $message);
            }
        )*
    };
}

macro_rules! adversarial_binary_vec_cases {
    ($($name:ident: $lhs:expr, $rhs:expr => $expected:expr, $message:literal;)*) => {
        $(
            #[test]
            fn $name() {
                let lhs: Vec<u32> = $lhs;
                let rhs: Vec<u32> = $rhs;
                $crate::common::assert_unwind_or_eq(|| cpu_ref(&lhs, &rhs), $expected, $message);
            }
        )*
    };
}

macro_rules! adversarial_vec_u32_cases {
    ($($name:ident: $input:expr, $arg:expr => $expected:expr, $message:literal;)*) => {
        $(
            #[test]
            fn $name() {
                let input: Vec<u32> = $input;
                let arg: u32 = $arg;
                $crate::common::assert_unwind_or_eq(|| cpu_ref(&input, arg), $expected, $message);
            }
        )*
    };
}

macro_rules! adversarial_binary_vec_usize_cases {
    ($($name:ident: $lhs:expr, $rhs:expr, $arg:expr => $expected:expr, $message:literal;)*) => {
        $(
            #[test]
            fn $name() {
                let lhs: Vec<u32> = $lhs;
                let rhs: Vec<u32> = $rhs;
                let arg: usize = $arg;
                $crate::common::assert_unwind_or_eq(|| cpu_ref(&lhs, &rhs, arg), $expected, $message);
            }
        )*
    };
}