etest_impl/
macros.rs

1use proc_macro::{Delimiter, Group, Span, TokenStream, TokenTree};
2
3use crate::{ Config, Function };
4use crate::utils::err;
5
6pub fn etest(attr: TokenStream, item: TokenStream) -> TokenStream {
7    let cfg = match Config::parse(attr) {
8        Ok(c)	=> c,
9        Err(e)	=> return e,
10    };
11
12    let func = match Function::parse(item) {
13        Err(e)	=> return err(Span::call_site(), &format!("failed to parse function {e:?}")),
14        Ok(f)	=> f,
15    };
16
17    let mut res = Vec::new();
18
19    // this adds '#[test]' or so
20    res.extend(cfg.emit_test_decl(&func));
21
22    let mut body = Vec::<TokenTree>::new();
23
24    body.extend(cfg.emit_generic(&func));
25
26    body.extend(cfg.emit_skip_fn(&func));
27    body.extend(cfg.emit_lock(&func));
28    body.extend(cfg.emit_timeout(&func));
29
30    res.extend(func.decl);
31    res.push(TokenTree::Group(Group::new(Delimiter::Brace, body.into_iter().collect())));
32
33    res.into_iter().collect()
34}