mod mode;
use mode::{cargo_test, execution};
use anyhow::Result;
use regex::Regex;
use std::collections::VecDeque;
use std::{env, path::PathBuf};
fn is_run_implied() -> bool {
if std::env::args().count() < 2 {
return false;
}
let test_re = Regex::new(r"^(--bench|--dir|.+\.wasm)")
.expect("BUG: Regex error with lunatic::mode::execution::is_run_implied()");
test_re.is_match(&std::env::args().nth(1).unwrap())
}
#[tokio::main]
async fn main() -> Result<()> {
let augmented_args = if is_run_implied() {
let mut augmented_args: VecDeque<String> = std::env::args().collect();
augmented_args.insert(1, "run".to_owned());
Some(augmented_args.into())
} else {
None
};
let cargo_test = match env::var("CARGO_MANIFEST_DIR") {
Ok(_manifest_dir) => {
let test_path_matcher: PathBuf = [
"target",
"wasm32-(wasi|unknown-unknown)",
"(debug|release)",
"deps",
]
.iter()
.collect();
let separator = format!("{}", std::path::MAIN_SEPARATOR).replace('\\', r"\\");
let test_path_matcher = test_path_matcher.to_string_lossy().replace('\\', r"\\");
let test_regex = format!("{separator}{test_path_matcher}{separator}.*\\.wasm$");
let test_regex = regex::Regex::new(&test_regex).unwrap();
let skip_positions = match is_run_implied() {
true => 1,
false => 2,
};
let mut arguments = env::args().skip(skip_positions);
match arguments.next() {
Some(wasm_file) => {
test_regex.is_match(&wasm_file) && !arguments.any(|arg| arg == "--bench")
}
None => false,
}
}
Err(_) => false,
};
if cargo_test {
cargo_test::test(augmented_args).await
} else {
execution::execute(augmented_args).await
}
}