use proc_macro2::TokenStream as TokenStream2;
use std::fmt::Display;
use std::marker::PhantomData;
use syn::parse::Parse;
pub struct Assert<T: Parse, U: Display> {
_t: PhantomData<T>,
_u: PhantomData<U>,
}
pub fn make_assert<T, U>() -> Assert<T, U>
where
T: Parse,
U: Display,
{
Assert::<T, U> {
_t: PhantomData,
_u: PhantomData,
}
}
impl<T: Parse, U: Display> Assert<T, U> {
pub fn error(&self, arg: TokenStream2, error: U) {
let arg: syn::Result<T> = syn::parse2(arg);
match arg {
Ok(_) => {
panic!("must occurre error.");
}
Err(e) => {
assert_eq!(e.to_string(), error.to_string());
}
}
}
pub fn ok<V>(&self, arg: TokenStream2, assert: V)
where
V: FnOnce(T),
{
let arg: syn::Result<T> = syn::parse2(arg);
match arg {
Ok(a) => {
assert(a);
}
Err(_) => {
panic!("must not occurre error.");
}
}
}
}