use serde::Deserialize; use std::fs; use std::io::Read; use std::{env, path::Path}; #[derive(Deserialize, Debug)] struct Manifest { package: Package, } #[derive(Deserialize, Debug)] struct Package { version: String, } fn main() { println!("cargo:rerun-if-changed=Cargo.toml"); let out_dir = env::var_os("OUT_DIR").unwrap(); let dest_path = Path::new(&out_dir).join("cao_lang_version.rs"); let mut mf = std::fs::OpenOptions::new() .read(true) .open("Cargo.toml") .expect("Failed to open the manifest file"); let mut manifest = String::with_capacity(1024); mf.read_to_string(&mut manifest) .expect("Failed to read manifest"); let conf: Manifest = toml::from_str(manifest.as_str()).expect("Failed to parse manifest"); let version = semver::Version::parse(conf.package.version.as_str()) .expect("Crate version wasn't valid semver"); fs::write( dest_path, format!( r#" pub const VERSION_STR: &str = "{}"; pub const MAJOR: u8 = {}; pub const MINOR: u8 = {}; pub const PATCH: u16 = {}; "#, conf.package.version, version.major, version.minor, version.patch, ), ) .expect("Failed to write version file"); }