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 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}