2025-10-22 13:55:35 +03:00
|
|
|
extern crate proc_macro;
|
|
|
|
|
|
|
|
|
|
use proc_macro::*;
|
|
|
|
|
|
|
|
|
|
#[proc_macro_attribute]
|
2025-10-28 10:41:40 +02:00
|
|
|
pub fn nssa_integration_test(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
2025-10-22 13:55:35 +03:00
|
|
|
let input = item.to_string();
|
|
|
|
|
|
|
|
|
|
let fn_keyword = "fn ";
|
|
|
|
|
let fn_keyword_alternative = "fn\n";
|
|
|
|
|
|
|
|
|
|
let mut start_opt = None;
|
|
|
|
|
let mut fn_name = String::new();
|
|
|
|
|
|
|
|
|
|
if let Some(start) = input.find(fn_keyword) {
|
|
|
|
|
start_opt = Some(start);
|
|
|
|
|
} else if let Some(start) = input.find(fn_keyword_alternative) {
|
|
|
|
|
start_opt = Some(start);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if let Some(start) = start_opt {
|
|
|
|
|
let rest = &input[start + fn_keyword.len()..];
|
|
|
|
|
if let Some(end) = rest.find(|c: char| c == '(' || c.is_whitespace()) {
|
|
|
|
|
let name = &rest[..end];
|
|
|
|
|
fn_name = name.to_string();
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
println!("ERROR: keyword fn not found");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let extension = format!(
|
|
|
|
|
r#"
|
|
|
|
|
{input}
|
|
|
|
|
|
|
|
|
|
function_map.insert("{fn_name}".to_string(), |home_dir: PathBuf| Box::pin(async {{
|
|
|
|
|
let res = pre_test(home_dir).await.unwrap();
|
|
|
|
|
|
|
|
|
|
info!("Waiting for first block creation");
|
|
|
|
|
tokio::time::sleep(Duration::from_secs(TIME_TO_WAIT_FOR_BLOCK_SECONDS)).await;
|
|
|
|
|
|
|
|
|
|
{fn_name}().await;
|
|
|
|
|
|
|
|
|
|
post_test(res).await;
|
|
|
|
|
}}));
|
|
|
|
|
"#
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
extension.parse().unwrap()
|
|
|
|
|
}
|