use std::env; use std::fs::File; use std::io::Write; use std::path::Path; use walkdir::WalkDir; fn main() { let out_dir = env::var("OUT_DIR").unwrap(); let destination = Path::new(&out_dir).join("tests.rs"); let mut test_file = File::create(&destination).unwrap(); write_header(&mut test_file); let test_files = WalkDir::new("org_mode_samples") .into_iter() .filter(|e| match e { Ok(dir_entry) => { dir_entry.file_type().is_file() && Path::new(dir_entry.file_name()) .extension() .map(|ext| ext.to_ascii_lowercase() == "org") .unwrap_or(false) } Err(_) => true, }).collect::, _>>().unwrap(); for test in test_files { write_test(&mut test_file, &test); } } fn write_test(test_file: &mut File, test: &walkdir::DirEntry) { let test_name = test.path().strip_prefix("org_mode_samples/").expect("Paths should be under org_mode_samples/").to_string_lossy().to_lowercase().strip_suffix(".org").expect("Should have .org extension").replace("/", "_"); write!( test_file, include_str!("./tests/test_template"), name = test_name, path = test.path().display() ) .unwrap(); } fn write_header(test_file: &mut File) { write!( test_file, r#" #[feature(exit_status_error)] use organic::compare_document; use organic::document; use organic::emacs_parse_org_document; use organic::sexp; "# ) .unwrap(); }