1use proc_macro2::TokenStream as TokenStream2;
2use std::fmt::Display;
3use std::marker::PhantomData;
4use syn::parse::Parse;
5
6pub struct Assert<T: Parse, U: Display> {
8 _t: PhantomData<T>,
9 _u: PhantomData<U>,
10}
11
12pub fn make_assert<T, U>() -> Assert<T, U>
14where
15 T: Parse,
16 U: Display,
17{
18 Assert::<T, U> {
19 _t: PhantomData,
20 _u: PhantomData,
21 }
22}
23
24impl<T: Parse, U: Display> Assert<T, U> {
25 pub fn error(&self, arg: TokenStream2, error: U) {
30 let arg: syn::Result<T> = syn::parse2(arg);
31 match arg {
32 Ok(_) => {
33 panic!("must occurre error.");
34 }
35 Err(e) => {
36 assert_eq!(e.to_string(), error.to_string());
37 }
38 }
39 }
40
41 pub fn ok<V>(&self, arg: TokenStream2, assert: V)
46 where
47 V: FnOnce(T),
48 {
49 let arg: syn::Result<T> = syn::parse2(arg);
50 match arg {
51 Ok(a) => {
52 assert(a);
53 }
54 Err(_) => {
55 panic!("must not occurre error.");
56 }
57 }
58 }
59}