From df6ad1e9e22bf610186d7aa821f8235d5a1f5be4 Mon Sep 17 00:00:00 2001 From: Omar Abdulla Date: Thu, 24 Jul 2025 14:51:42 +0300 Subject: [PATCH] Refactor some code into the common crate --- Cargo.lock | 11 +++++--- crates/common/Cargo.toml | 4 +++ .../src/concepts}/blocking_executor.rs | 6 +++-- crates/common/src/concepts/mod.rs | 3 +++ .../files_with_extension_iterator.rs} | 0 crates/common/src/iterators/mod.rs | 3 +++ crates/common/src/lib.rs | 4 +++ .../src/macros/define_wrapper_type.rs} | 26 +++++++++++-------- crates/common/src/macros/mod.rs | 3 +++ crates/core/Cargo.toml | 1 + crates/core/src/driver/mod.rs | 7 ++--- crates/core/src/lib.rs | 1 - crates/format/Cargo.toml | 1 + crates/format/src/case.rs | 5 ++-- crates/format/src/input.rs | 5 ++-- crates/format/src/lib.rs | 1 - crates/format/src/metadata.rs | 15 +++++++---- crates/node-interaction/Cargo.toml | 4 --- crates/node-interaction/src/lib.rs | 3 --- crates/node/Cargo.toml | 1 + crates/node/src/geth.rs | 3 ++- crates/node/src/kitchensink.rs | 3 ++- 22 files changed, 70 insertions(+), 40 deletions(-) rename crates/{node-interaction/src => common/src/concepts}/blocking_executor.rs (98%) create mode 100644 crates/common/src/concepts/mod.rs rename crates/{core/src/common.rs => common/src/iterators/files_with_extension_iterator.rs} (100%) create mode 100644 crates/common/src/iterators/mod.rs rename crates/{format/src/macros.rs => common/src/macros/define_wrapper_type.rs} (78%) create mode 100644 crates/common/src/macros/mod.rs diff --git a/Cargo.lock b/Cargo.lock index b1c97a6..5dde5f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3953,6 +3953,10 @@ name = "revive-dt-common" version = "0.1.0" dependencies = [ "anyhow", + "futures", + "once_cell", + "tokio", + "tracing", ] [[package]] @@ -3989,6 +3993,7 @@ dependencies = [ "clap", "indexmap 2.10.0", "rayon", + "revive-dt-common", "revive-dt-compiler", "revive-dt-config", "revive-dt-format", @@ -4010,6 +4015,7 @@ dependencies = [ "alloy-primitives", "alloy-sol-types", "anyhow", + "revive-dt-common", "revive-dt-node-interaction", "semver 1.0.26", "serde", @@ -4023,6 +4029,7 @@ version = "0.1.0" dependencies = [ "alloy", "anyhow", + "revive-dt-common", "revive-dt-config", "revive-dt-node-interaction", "serde", @@ -4040,10 +4047,6 @@ version = "0.1.0" dependencies = [ "alloy", "anyhow", - "futures", - "once_cell", - "tokio", - "tracing", ] [[package]] diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index 5f956f9..50d3d5e 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -10,3 +10,7 @@ rust-version.workspace = true [dependencies] anyhow = { workspace = true } +futures = { workspace = true } +tracing = { workspace = true } +once_cell = { workspace = true } +tokio = { workspace = true } diff --git a/crates/node-interaction/src/blocking_executor.rs b/crates/common/src/concepts/blocking_executor.rs similarity index 98% rename from crates/node-interaction/src/blocking_executor.rs rename to crates/common/src/concepts/blocking_executor.rs index 5458bb3..f9364a3 100644 --- a/crates/node-interaction/src/blocking_executor.rs +++ b/crates/common/src/concepts/blocking_executor.rs @@ -23,7 +23,7 @@ use tracing::Instrument; /// executor to drive an async computation: /// /// ```rust -/// use revive_dt_node_interaction::*; +/// use revive_dt_common::concepts::*; /// /// fn blocking_function() { /// let result = BlockingExecutor::execute(async move { @@ -208,7 +208,9 @@ mod test { fn panics_in_futures_are_caught() { // Act let result = BlockingExecutor::execute(async move { - panic!("This is a panic!"); + panic!( + "If this panic causes, well, a panic, then this is an issue. If it's caught then all good!" + ); 0xFFu8 }); diff --git a/crates/common/src/concepts/mod.rs b/crates/common/src/concepts/mod.rs new file mode 100644 index 0000000..cf633e9 --- /dev/null +++ b/crates/common/src/concepts/mod.rs @@ -0,0 +1,3 @@ +mod blocking_executor; + +pub use blocking_executor::*; diff --git a/crates/core/src/common.rs b/crates/common/src/iterators/files_with_extension_iterator.rs similarity index 100% rename from crates/core/src/common.rs rename to crates/common/src/iterators/files_with_extension_iterator.rs diff --git a/crates/common/src/iterators/mod.rs b/crates/common/src/iterators/mod.rs new file mode 100644 index 0000000..f94237a --- /dev/null +++ b/crates/common/src/iterators/mod.rs @@ -0,0 +1,3 @@ +mod files_with_extension_iterator; + +pub use files_with_extension_iterator::*; diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index a55ae5b..baee9f1 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -1,2 +1,6 @@ //! This crate provides common concepts, functionality, types, macros, and more that other crates in //! the workspace can benefit from. + +pub mod concepts; +pub mod iterators; +pub mod macros; diff --git a/crates/format/src/macros.rs b/crates/common/src/macros/define_wrapper_type.rs similarity index 78% rename from crates/format/src/macros.rs rename to crates/common/src/macros/define_wrapper_type.rs index ed67012..28a9e53 100644 --- a/crates/format/src/macros.rs +++ b/crates/common/src/macros/define_wrapper_type.rs @@ -12,11 +12,9 @@ /// pub struct CaseId(usize); /// ``` /// -/// And would also implement a number of methods on this type making it easier -/// to use. +/// And would also implement a number of methods on this type making it easier to use. /// -/// These wrapper types become very useful as they make the code a lot easier -/// to read. +/// These wrapper types become very useful as they make the code a lot easier to read. /// /// Take the following as an example: /// @@ -26,26 +24,28 @@ /// } /// ``` /// -/// In the above code it's hard to understand what the various types refer to or -/// what to expect them to contain. +/// In the above code it's hard to understand what the various types refer to or what to expect them +/// to contain. /// -/// With these wrapper types we're able to create code that's self-documenting -/// in that the types tell us what the code is referring to. The above code is -/// transformed into +/// With these wrapper types we're able to create code that's self-documenting in that the types +/// tell us what the code is referring to. The above code is transformed into /// /// ```rust,ignore /// struct State { /// contracts: HashMap> /// } /// ``` +/// +/// Note that we follow the same syntax for defining wrapper structs but we do not permit the use of +/// generics. #[macro_export] macro_rules! define_wrapper_type { ( $(#[$meta: meta])* - $ident: ident($ty: ty) $(;)? + $vis:vis struct $ident: ident($ty: ty); ) => { $(#[$meta])* - pub struct $ident($ty); + $vis struct $ident($ty); impl $ident { pub fn new(value: $ty) -> Self { @@ -104,3 +104,7 @@ macro_rules! define_wrapper_type { } }; } + +/// Technically not needed but this allows for the macro to be found in the `macros` module of the +/// crate in addition to being found in the root of the crate. +pub use define_wrapper_type; diff --git a/crates/common/src/macros/mod.rs b/crates/common/src/macros/mod.rs new file mode 100644 index 0000000..1c3f233 --- /dev/null +++ b/crates/common/src/macros/mod.rs @@ -0,0 +1,3 @@ +mod define_wrapper_type; + +pub use define_wrapper_type::*; diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 89fe7b9..7c6c551 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -13,6 +13,7 @@ name = "retester" path = "src/main.rs" [dependencies] +revive-dt-common = { workspace = true } revive-dt-compiler = { workspace = true } revive-dt-config = { workspace = true } revive-dt-format = { workspace = true } diff --git a/crates/core/src/driver/mod.rs b/crates/core/src/driver/mod.rs index 745fc25..a78100b 100644 --- a/crates/core/src/driver/mod.rs +++ b/crates/core/src/driver/mod.rs @@ -1,6 +1,7 @@ //! The test driver handles the compilation and execution of the test cases. use std::collections::HashMap; +use std::fmt::Debug; use std::marker::PhantomData; use alloy::json_abi::JsonAbi; @@ -19,6 +20,9 @@ use alloy::{ }; use anyhow::Context; use indexmap::IndexMap; +use serde_json::Value; + +use revive_dt_common::iterators::FilesWithExtensionIterator; use revive_dt_compiler::{Compiler, SolidityCompiler}; use revive_dt_config::Arguments; use revive_dt_format::case::CaseIdx; @@ -29,11 +33,8 @@ use revive_dt_node::Node; use revive_dt_node_interaction::EthereumNode; use revive_dt_report::reporter::{CompilationTask, Report, Span}; use revive_solc_json_interface::SolcStandardJsonOutput; -use serde_json::Value; -use std::fmt::Debug; use crate::Platform; -use crate::common::*; pub struct State<'a, T: Platform> { /// The configuration that the framework was started with. diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index f7df15c..a955838 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -8,7 +8,6 @@ use revive_dt_config::TestingPlatform; use revive_dt_node::{Node, geth, kitchensink::KitchensinkNode}; use revive_dt_node_interaction::EthereumNode; -pub mod common; pub mod driver; /// One platform can be tested differentially against another. diff --git a/crates/format/Cargo.toml b/crates/format/Cargo.toml index c1b7674..a1f4286 100644 --- a/crates/format/Cargo.toml +++ b/crates/format/Cargo.toml @@ -9,6 +9,7 @@ repository.workspace = true rust-version.workspace = true [dependencies] +revive-dt-common = { workspace = true } revive-dt-node-interaction = { workspace = true } alloy = { workspace = true } diff --git a/crates/format/src/case.rs b/crates/format/src/case.rs index 29e4ef5..4c59ab9 100644 --- a/crates/format/src/case.rs +++ b/crates/format/src/case.rs @@ -1,7 +1,8 @@ use serde::Deserialize; +use revive_dt_common::macros::define_wrapper_type; + use crate::{ - define_wrapper_type, input::{Expected, Input}, mode::Mode, }; @@ -45,5 +46,5 @@ impl Case { define_wrapper_type!( /// A wrapper type for the index of test cases found in metadata file. #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] - CaseIdx(usize); + pub struct CaseIdx(usize); ); diff --git a/crates/format/src/input.rs b/crates/format/src/input.rs index 2bc0a88..59f9ca5 100644 --- a/crates/format/src/input.rs +++ b/crates/format/src/input.rs @@ -11,9 +11,10 @@ use alloy_primitives::{FixedBytes, utils::parse_units}; use semver::VersionReq; use serde::{Deserialize, Serialize}; +use revive_dt_common::macros::define_wrapper_type; use revive_dt_node_interaction::EthereumNode; -use crate::{define_wrapper_type, metadata::ContractInstance}; +use crate::metadata::ContractInstance; #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)] pub struct Input { @@ -84,7 +85,7 @@ pub enum Method { define_wrapper_type!( #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] - EtherValue(U256); + pub struct EtherValue(U256); ); impl Serialize for EtherValue { diff --git a/crates/format/src/lib.rs b/crates/format/src/lib.rs index f66d883..21ae375 100644 --- a/crates/format/src/lib.rs +++ b/crates/format/src/lib.rs @@ -3,6 +3,5 @@ pub mod case; pub mod corpus; pub mod input; -pub mod macros; pub mod metadata; pub mod mode; diff --git a/crates/format/src/metadata.rs b/crates/format/src/metadata.rs index c1cef62..f6de7d7 100644 --- a/crates/format/src/metadata.rs +++ b/crates/format/src/metadata.rs @@ -9,9 +9,10 @@ use std::{ use serde::{Deserialize, Serialize}; +use revive_dt_common::macros::define_wrapper_type; + use crate::{ case::Case, - define_wrapper_type, mode::{Mode, SolcMode}, }; @@ -217,18 +218,22 @@ define_wrapper_type!( /// Represents a contract instance found a metadata file. /// /// Typically, this is used as the key to the "contracts" field of metadata files. - #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] + #[derive( + Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, + )] #[serde(transparent)] - ContractInstance(String); + pub struct ContractInstance(String); ); define_wrapper_type!( /// Represents a contract identifier found a metadata file. /// /// A contract identifier is the name of the contract in the source code. - #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] + #[derive( + Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, + )] #[serde(transparent)] - ContractIdent(String); + pub struct ContractIdent(String); ); /// Represents an identifier used for contracts. diff --git a/crates/node-interaction/Cargo.toml b/crates/node-interaction/Cargo.toml index 84ea315..9953c69 100644 --- a/crates/node-interaction/Cargo.toml +++ b/crates/node-interaction/Cargo.toml @@ -11,7 +11,3 @@ rust-version.workspace = true [dependencies] alloy = { workspace = true } anyhow = { workspace = true } -futures = { workspace = true } -tracing = { workspace = true } -once_cell = { workspace = true } -tokio = { workspace = true } diff --git a/crates/node-interaction/src/lib.rs b/crates/node-interaction/src/lib.rs index 8ac488c..bf7bcf4 100644 --- a/crates/node-interaction/src/lib.rs +++ b/crates/node-interaction/src/lib.rs @@ -6,9 +6,6 @@ use alloy::rpc::types::trace::geth::{DiffMode, GethDebugTracingOptions, GethTrac use alloy::rpc::types::{TransactionReceipt, TransactionRequest}; use anyhow::Result; -mod blocking_executor; -pub use blocking_executor::*; - /// An interface for all interactions with Ethereum compatible nodes. pub trait EthereumNode { /// Execute the [TransactionRequest] and return a [TransactionReceipt]. diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml index 48b5e2d..bbb9e80 100644 --- a/crates/node/Cargo.toml +++ b/crates/node/Cargo.toml @@ -15,6 +15,7 @@ tracing = { workspace = true } tokio = { workspace = true } revive-dt-node-interaction = { workspace = true } +revive-dt-common = { workspace = true } revive-dt-config = { workspace = true } serde = { workspace = true } diff --git a/crates/node/src/geth.rs b/crates/node/src/geth.rs index d91a8aa..c37fb04 100644 --- a/crates/node/src/geth.rs +++ b/crates/node/src/geth.rs @@ -25,8 +25,9 @@ use alloy::{ }, signers::local::PrivateKeySigner, }; +use revive_dt_common::concepts::BlockingExecutor; use revive_dt_config::Arguments; -use revive_dt_node_interaction::{BlockingExecutor, EthereumNode}; +use revive_dt_node_interaction::EthereumNode; use tracing::Level; use crate::{Node, common::FallbackGasFiller, constants::INITIAL_BALANCE}; diff --git a/crates/node/src/kitchensink.rs b/crates/node/src/kitchensink.rs index 200f6aa..bc198a1 100644 --- a/crates/node/src/kitchensink.rs +++ b/crates/node/src/kitchensink.rs @@ -36,8 +36,9 @@ use sp_core::crypto::Ss58Codec; use sp_runtime::AccountId32; use tracing::Level; +use revive_dt_common::concepts::BlockingExecutor; use revive_dt_config::Arguments; -use revive_dt_node_interaction::{BlockingExecutor, EthereumNode}; +use revive_dt_node_interaction::EthereumNode; use crate::{Node, common::FallbackGasFiller, constants::INITIAL_BALANCE};