#![allow(clippy::print_stdout, clippy::print_stderr)]
const DEFAULT_TYPE_URI_BASE: &str =
"https://github.com/zircote/nsip/blob/main/docs/reference/errors";
fn main() {
println!("cargo::rerun-if-changed=Cargo.toml");
println!("cargo::rerun-if-changed=build.rs");
let nsip = read_nsip_metadata();
let base = nsip
.as_ref()
.and_then(|t| t.get("error-type-uri-base"))
.and_then(toml::Value::as_str)
.unwrap_or(DEFAULT_TYPE_URI_BASE);
println!("cargo::rustc-env=NSIP_ERROR_TYPE_URI_BASE={base}");
if let Some(slugs) = nsip
.as_ref()
.and_then(|t| t.get("error-slugs"))
.and_then(toml::Value::as_table)
{
for (key, value) in slugs {
if let Some(slug) = value.as_str() {
let env_key = key.to_uppercase().replace('-', "_");
println!("cargo::rustc-env=NSIP_SLUG_{env_key}={slug}");
}
}
}
}
fn read_nsip_metadata() -> Option<toml::Value> {
let dir = std::env::var("CARGO_MANIFEST_DIR").ok()?;
let path = std::path::Path::new(&dir).join("Cargo.toml");
let content = std::fs::read_to_string(path).ok()?;
let manifest: toml::Table = content.parse().ok()?;
manifest
.get("package")?
.get("metadata")?
.get("nsip")
.cloned()
}