use std::collections::BTreeSet;
use std::fmt::Write as _;
use std::path::PathBuf;
use std::{env, fs};
fn main() {
let manifest_dir =
PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("cargo sets CARGO_MANIFEST_DIR"));
let providers_dir = manifest_dir.join("providers");
println!("cargo:rerun-if-changed={}", providers_dir.display());
println!("cargo:rerun-if-changed=build.rs");
let read = fs::read_dir(&providers_dir).unwrap_or_else(|err| {
panic!("cannot read {}: {err}", providers_dir.display());
});
let manifests: BTreeSet<PathBuf> = read
.filter_map(Result::ok)
.map(|entry| entry.path())
.filter(|path| path.extension().is_some_and(|ext| ext == "toml"))
.collect();
assert!(
!manifests.is_empty(),
"no provider manifests found in {}",
providers_dir.display()
);
let mut generated = String::from(
"/// Provider manifests embedded from `providers/*.toml` at build time.\n\
pub static BUILTIN_MANIFESTS: &[(&str, &str)] = &[\n",
);
for path in &manifests {
println!("cargo:rerun-if-changed={}", path.display());
let name = path
.file_name()
.expect("directory entries have names")
.to_string_lossy();
let include_path = path.to_string_lossy().replace('\\', "/");
writeln!(generated, " ({name:?}, include_str!({include_path:?})),")
.expect("writing to a String cannot fail");
}
generated.push_str("];\n");
let out = PathBuf::from(env::var("OUT_DIR").expect("cargo sets OUT_DIR"))
.join("builtin_manifests.rs");
fs::write(&out, generated).unwrap_or_else(|err| {
panic!("cannot write {}: {err}", out.display());
});
}