diff --git a/framework/meta/src/cmd.rs b/framework/meta/src/cmd.rs index 8dc9863398..70371c03dc 100644 --- a/framework/meta/src/cmd.rs +++ b/framework/meta/src/cmd.rs @@ -1,4 +1,5 @@ pub mod all; +pub mod cargo_toml; pub mod chain_simulator; pub mod code_report; pub mod info; diff --git a/framework/meta/src/cmd/all.rs b/framework/meta/src/cmd/all.rs index d44835bd0b..a360afc7c5 100644 --- a/framework/meta/src/cmd/all.rs +++ b/framework/meta/src/cmd/all.rs @@ -1,4 +1,7 @@ -use super::print_util::{print_all_command, print_all_count, print_all_index}; +use super::{ + cargo_toml::check_executor, + print_util::{print_all_command, print_all_count, print_all_index}, +}; use crate::{ cli::AllArgs, folder_structure::{dir_pretty_print, RelevantDirectories}, @@ -17,6 +20,9 @@ pub fn call_all_meta(args: &AllArgs) { fn perform_call_all_meta(path: &Path, ignore: &[String], raw_args: Vec) { let dirs = RelevantDirectories::find_all(path, ignore); + + check_executor(&dirs); + dir_pretty_print(dirs.iter_contract_crates(), "", &|_| {}); let num_contract_crates = dirs.iter_contract_crates().count(); diff --git a/framework/meta/src/cmd/cargo_toml.rs b/framework/meta/src/cmd/cargo_toml.rs new file mode 100644 index 0000000000..5d4480c568 --- /dev/null +++ b/framework/meta/src/cmd/cargo_toml.rs @@ -0,0 +1,57 @@ +use std::collections::{HashMap, HashSet}; + +use serde::Deserialize; + +use crate::folder_structure::RelevantDirectories; + +const CARGO_TOML: &str = "Cargo.toml"; +const SCENARIO: &str = "multiversx-sc-scenario"; +const WASMER: &str = "wasmer"; + +#[derive(Debug, Deserialize)] +struct CargoToml { + #[serde(default, rename = "dev-dependencies")] + dev_dependencies: HashMap, +} + +#[derive(Debug, Deserialize)] +#[serde(untagged)] +#[allow(dead_code)] +enum Dependency { + Simple(String), + Detailed(DependencyDetail), +} + +#[derive(Debug, Deserialize)] +struct DependencyDetail { + #[serde(default)] + pub features: Vec, +} + +pub fn check_executor(relevant_directories: &RelevantDirectories) { + let mut scenario_features: HashSet = HashSet::new(); + + for dir in relevant_directories.iter() { + let toml_dir = dir.path.join(CARGO_TOML); + let content = std::fs::read_to_string(toml_dir).unwrap(); + let cargo_toml_content: CargoToml = toml::from_str(&content).unwrap(); + let dependencies = &cargo_toml_content.dev_dependencies; + + if let Some(Dependency::Detailed(dependency)) = dependencies.get(SCENARIO) { + for feature in dependency.features.iter() { + if !scenario_features.contains(feature) { + scenario_features.insert(feature.clone()); + } + } + } + } + + let count = scenario_features + .iter() + .filter(|s| s.contains(WASMER)) + .count(); + + if count > 1 { + panic!("Cannot import two different executors: found multiple wasmer components"); + } +}