112a9d9c8Sopenharmony_ciuse std::char;
212a9d9c8Sopenharmony_ciuse std::env;
312a9d9c8Sopenharmony_ciuse std::ffi::OsStr;
412a9d9c8Sopenharmony_ciuse std::fs::{self, File};
512a9d9c8Sopenharmony_ciuse std::io::Write;
612a9d9c8Sopenharmony_ciuse std::path::{Path, PathBuf};
712a9d9c8Sopenharmony_ci
812a9d9c8Sopenharmony_cipub fn main() {
912a9d9c8Sopenharmony_ci    let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
1012a9d9c8Sopenharmony_ci    let mut dst = File::create(Path::new(&out_dir).join("tests.rs")).unwrap();
1112a9d9c8Sopenharmony_ci
1212a9d9c8Sopenharmony_ci    let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
1312a9d9c8Sopenharmony_ci    let headers_dir = manifest_dir.join("tests").join("headers");
1412a9d9c8Sopenharmony_ci
1512a9d9c8Sopenharmony_ci    let headers = match fs::read_dir(headers_dir) {
1612a9d9c8Sopenharmony_ci        Ok(dir) => dir,
1712a9d9c8Sopenharmony_ci        // We may not have headers directory after packaging.
1812a9d9c8Sopenharmony_ci        Err(..) => return,
1912a9d9c8Sopenharmony_ci    };
2012a9d9c8Sopenharmony_ci
2112a9d9c8Sopenharmony_ci    let entries =
2212a9d9c8Sopenharmony_ci        headers.map(|result| result.expect("Couldn't read header file"));
2312a9d9c8Sopenharmony_ci
2412a9d9c8Sopenharmony_ci    println!("cargo:rerun-if-changed=tests/headers");
2512a9d9c8Sopenharmony_ci
2612a9d9c8Sopenharmony_ci    for entry in entries {
2712a9d9c8Sopenharmony_ci        match entry.path().extension().and_then(OsStr::to_str) {
2812a9d9c8Sopenharmony_ci            Some("h") | Some("hpp") => {
2912a9d9c8Sopenharmony_ci                let func = entry
3012a9d9c8Sopenharmony_ci                    .file_name()
3112a9d9c8Sopenharmony_ci                    .to_str()
3212a9d9c8Sopenharmony_ci                    .unwrap()
3312a9d9c8Sopenharmony_ci                    .replace(|c| !char::is_alphanumeric(c), "_")
3412a9d9c8Sopenharmony_ci                    .replace("__", "_")
3512a9d9c8Sopenharmony_ci                    .to_lowercase();
3612a9d9c8Sopenharmony_ci                writeln!(
3712a9d9c8Sopenharmony_ci                    dst,
3812a9d9c8Sopenharmony_ci                    "test_header!(header_{}, {:?});",
3912a9d9c8Sopenharmony_ci                    func,
4012a9d9c8Sopenharmony_ci                    entry.path(),
4112a9d9c8Sopenharmony_ci                )
4212a9d9c8Sopenharmony_ci                .unwrap();
4312a9d9c8Sopenharmony_ci            }
4412a9d9c8Sopenharmony_ci            _ => {}
4512a9d9c8Sopenharmony_ci        }
4612a9d9c8Sopenharmony_ci    }
4712a9d9c8Sopenharmony_ci
4812a9d9c8Sopenharmony_ci    dst.flush().unwrap();
4912a9d9c8Sopenharmony_ci}
50