use cargo_toml::{Dependency, DependencyDetail, Manifest};
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=../Cargo.lock");
let plonk_version = parse_plonk_version();
println!("cargo:rustc-env=RUSK_KEY_PLONK_VERSION={plonk_version}",);
Ok(())
}
fn parse_plonk_version() -> String {
let cargo_toml = include_bytes!("./Cargo.toml");
let cargo_toml = Manifest::from_slice(cargo_toml)
.expect("Couldn't parse workspace manifest");
let plonk_dep = &cargo_toml.dependencies["dusk-plonk"];
let mut version = match plonk_dep {
Dependency::Simple(v) => v.clone(),
Dependency::Detailed(DependencyDetail {
version: Some(v), ..
}) => v.clone(),
_ => {
let manifest_dir = std::env::var("CARGO_MANIFEST_DIR")
.expect("CARGO_MANIFEST_DIR is not set");
let parent_toml = std::path::Path::new(&manifest_dir)
.parent()
.expect("parent folder to exists in dev")
.join("Cargo.toml");
let cargo_toml =
std::fs::read(parent_toml).expect("Cargo.toml to be read");
let cargo_toml = Manifest::from_slice(&cargo_toml)
.expect("Couldn't parse workspace manifest");
let plonk_dep = &cargo_toml
.workspace
.expect("Cargo.toml at crate root should define a workspace")
.dependencies["dusk-plonk"];
match plonk_dep {
Dependency::Simple(v) => v.clone(),
Dependency::Detailed(DependencyDetail {
version: Some(v),
..
}) => v.clone(),
_ => {
panic!("Couldn't find plonk version",)
}
}
}
};
if version.starts_with('=') {
version.remove(0);
}
version
}