use std::{env, fs, path::Path};
use serde::Deserialize;
#[derive(Deserialize)]
struct Manifest {
package: Package,
}
#[derive(Deserialize)]
struct Package {
metadata: Metadata,
}
#[derive(Deserialize)]
struct Metadata {
authors: Vec<Author>,
}
#[derive(Deserialize)]
struct Author {
name: String,
email: Option<String>,
}
fn main() {
println!("cargo:rerun-if-changed=Cargo.toml");
let manifest_dir = env::var_os("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR set by cargo");
let manifest_path = Path::new(&manifest_dir).join("Cargo.toml");
let raw = fs::read_to_string(&manifest_path).expect("read Cargo.toml");
let manifest: Manifest = toml::from_str(&raw).expect("parse Cargo.toml");
let primary = manifest
.package
.metadata
.authors
.into_iter()
.next()
.expect("package.metadata.authors must contain at least one entry");
println!("cargo:rustc-env=RUNNER_AUTHOR_NAME={}", primary.name);
if let Some(email) = primary.email.filter(|e| !e.is_empty()) {
println!("cargo:rustc-env=RUNNER_AUTHOR_EMAIL={email}");
}
}