Skip to main content

native/ex_cedar_native/build.rs

use std::fs;
use std::path::Path;

fn main() {
    let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
    let lock_path = Path::new(&manifest_dir).join("Cargo.lock");

    println!("cargo:rerun-if-changed=Cargo.lock");

    let content = fs::read_to_string(&lock_path).expect("Cargo.lock not found");
    let version = parse_cedar_version(&content).expect("cedar-policy not found in Cargo.lock");

    println!("cargo:rustc-env=CEDAR_POLICY_VERSION={version}");
}

fn parse_cedar_version(content: &str) -> Option<String> {
    content
        .split("[[package]]")
        .find(|block| block.contains(r#"name = "cedar-policy""#))?
        .lines()
        .find_map(|line| {
            line.trim()
                .strip_prefix("version = \"")?
                .strip_suffix('"')
                .map(str::to_owned)
        })
}