use std::env;
use std::fs;
use std::path::Path;
fn read_manifest(manifest_dir: &Path) -> toml::Table {
let cargo_toml_path = manifest_dir.join("Cargo.toml");
let content = fs::read_to_string(&cargo_toml_path).expect("Failed to read Cargo.toml");
content.parse().expect("Failed to parse Cargo.toml")
}
fn get_metadata_str<'a>(manifest: &'a toml::Table, key: &str) -> Option<&'a str> {
manifest
.get("package")
.and_then(|p| p.get("metadata"))
.and_then(|m| m.get("typst-bake"))
.and_then(|t| t.get(key))
.and_then(toml::Value::as_str)
}
fn resolve_path_string(manifest_dir: &Path, path: &str) -> String {
if Path::new(path).is_absolute() {
path.to_owned()
} else {
manifest_dir.join(path).to_string_lossy().into_owned()
}
}
pub fn rebuild_if_changed() {
let manifest_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set");
let manifest_dir = Path::new(&manifest_dir);
let manifest = read_manifest(manifest_dir);
for key in ["template-dir", "fonts-dir"] {
if let Some(dir) = get_metadata_str(&manifest, key) {
println!(
"cargo:rerun-if-changed={}",
resolve_path_string(manifest_dir, dir)
);
}
}
}