diff --git a/Cargo.lock b/Cargo.lock index d72e75796a..c2fcd6b888 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1022,6 +1022,7 @@ dependencies = [ "test-case", "thiserror", "tikv-jemallocator", + "toml", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index f32e5de75d..aac9152326 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -165,6 +165,7 @@ tokio = { version = "1.37.0", features = ["full"] } tokio-retry = "0.3" tokio-stream = "0.1.8" tokio-test = "0.4.4" +toml = "0.8" tower = "0.4.13" tracing = "0.1.37" tracing-subscriber = "0.3.16" diff --git a/crates/blockifier/Cargo.toml b/crates/blockifier/Cargo.toml index a3395538e1..ddc62087f2 100644 --- a/crates/blockifier/Cargo.toml +++ b/crates/blockifier/Cargo.toml @@ -52,6 +52,7 @@ strum.workspace = true strum_macros.workspace = true thiserror.workspace = true tikv-jemallocator = { workspace = true, optional = true } +toml.workspace = true [dev-dependencies] assert_matches.workspace = true diff --git a/crates/blockifier/src/test_utils/cairo_compile.rs b/crates/blockifier/src/test_utils/cairo_compile.rs index 61827ee5e0..c0835f9038 100644 --- a/crates/blockifier/src/test_utils/cairo_compile.rs +++ b/crates/blockifier/src/test_utils/cairo_compile.rs @@ -1,5 +1,56 @@ use std::process::Command; +use cached::proc_macro::cached; +use serde::{Deserialize, Serialize}; + +/// Objects for simple deserialization of Cargo.toml to fetch the Cairo1 compiler version. +/// The compiler itself isn't actually a dependency, so we compile by using the version of the +/// cairo-lang-casm crate. +/// The choice of cairo-lang-casm is arbitrary, as all compiler crate dependencies should have the +/// same version. +/// Deserializes: +/// """ +/// ... +/// [workspace.dependencies] +/// ... +/// cairo-lang-casm = VERSION +/// ... +/// """ +/// where `VERSION` can be a simple "x.y.z" version string or an object with a "version" field. +#[derive(Debug, Serialize, Deserialize)] +#[serde(untagged)] +enum DependencyValue { + // cairo-lang-casm = "x.y.z". + String(String), + // cairo-lang-casm = { version = "x.y.z", .. }. + Object { version: String }, +} + +#[derive(Debug, Serialize, Deserialize)] +struct CairoLangCasmDependency { + #[serde(rename = "cairo-lang-casm")] + cairo_lang_casm: DependencyValue, +} + +#[derive(Debug, Serialize, Deserialize)] +struct WorkspaceFields { + dependencies: CairoLangCasmDependency, +} + +#[derive(Debug, Serialize, Deserialize)] +struct CargoToml { + workspace: WorkspaceFields, +} + +#[cached] +/// Returns the version of the Cairo1 compiler* defined in the root Cargo.toml. +pub fn cairo1_compiler_version() -> String { + let cargo_toml: CargoToml = toml::from_str(include_str!("../../../../Cargo.toml")).unwrap(); + match cargo_toml.workspace.dependencies.cairo_lang_casm { + DependencyValue::String(version) | DependencyValue::Object { version } => version.clone(), + } +} + /// Compiles a Cairo0 program using the deprecated compiler. pub fn cairo0_compile(path: String, extra_arg: Option, debug_info: bool) -> Vec { let mut command = Command::new("starknet-compile-deprecated");