From 3045468742f0e7d08b9384ae43ecfb7993912a89 Mon Sep 17 00:00:00 2001 From: Omar Abdulla Date: Tue, 29 Jul 2025 10:02:45 +0300 Subject: [PATCH] Request `VersionOrRequirement` in compiler interface --- crates/compiler/src/lib.rs | 6 +++++- crates/compiler/src/revive_resolc.rs | 3 ++- crates/compiler/src/solc.rs | 4 ++-- crates/solc-binaries/src/download.rs | 22 ++++++++++++++++++++++ 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/crates/compiler/src/lib.rs b/crates/compiler/src/lib.rs index 63e496e..ab2eb2a 100644 --- a/crates/compiler/src/lib.rs +++ b/crates/compiler/src/lib.rs @@ -13,6 +13,7 @@ use alloy_primitives::Address; use revive_dt_config::Arguments; use revive_common::EVMVersion; +use revive_dt_solc_binaries::download::VersionOrRequirement; use revive_solc_json_interface::{ SolcStandardJsonInput, SolcStandardJsonInputLanguage, SolcStandardJsonInputSettings, SolcStandardJsonInputSettingsOptimizer, SolcStandardJsonInputSettingsSelection, @@ -37,7 +38,10 @@ pub trait SolidityCompiler { fn new(solc_executable: PathBuf) -> Self; - fn get_compiler_executable(config: &Arguments, version: Version) -> anyhow::Result; + fn get_compiler_executable( + config: &Arguments, + version: impl Into, + ) -> anyhow::Result; } /// The generic compilation input configuration. diff --git a/crates/compiler/src/revive_resolc.rs b/crates/compiler/src/revive_resolc.rs index dad9ee9..dd405c5 100644 --- a/crates/compiler/src/revive_resolc.rs +++ b/crates/compiler/src/revive_resolc.rs @@ -8,6 +8,7 @@ use std::{ use crate::{CompilerInput, CompilerOutput, SolidityCompiler}; use revive_dt_config::Arguments; +use revive_dt_solc_binaries::download::VersionOrRequirement; use revive_solc_json_interface::SolcStandardJsonOutput; // TODO: I believe that we need to also pass the solc compiler to resolc so that resolc uses the @@ -147,7 +148,7 @@ impl SolidityCompiler for Resolc { fn get_compiler_executable( config: &Arguments, - _version: semver::Version, + _version: impl Into, ) -> anyhow::Result { if !config.resolc.as_os_str().is_empty() { return Ok(config.resolc.clone()); diff --git a/crates/compiler/src/solc.rs b/crates/compiler/src/solc.rs index 8184b83..2d6fb83 100644 --- a/crates/compiler/src/solc.rs +++ b/crates/compiler/src/solc.rs @@ -8,7 +8,7 @@ use std::{ use crate::{CompilerInput, CompilerOutput, SolidityCompiler}; use revive_dt_config::Arguments; -use revive_dt_solc_binaries::download_solc; +use revive_dt_solc_binaries::{download::VersionOrRequirement, download_solc}; use revive_solc_json_interface::SolcStandardJsonOutput; #[derive(Debug)] @@ -95,7 +95,7 @@ impl SolidityCompiler for Solc { fn get_compiler_executable( config: &Arguments, - version: semver::Version, + version: impl Into, ) -> anyhow::Result { let path = download_solc(config.directory(), version, config.wasm)?; Ok(path) diff --git a/crates/solc-binaries/src/download.rs b/crates/solc-binaries/src/download.rs index 8e637d2..4a1cfae 100644 --- a/crates/solc-binaries/src/download.rs +++ b/crates/solc-binaries/src/download.rs @@ -145,6 +145,28 @@ impl From for VersionOrRequirement { } } +impl TryFrom for Version { + type Error = anyhow::Error; + + fn try_from(value: VersionOrRequirement) -> Result { + let VersionOrRequirement::Version(version) = value else { + anyhow::bail!("Version or requirement was not a version"); + }; + Ok(version) + } +} + +impl TryFrom for VersionReq { + type Error = anyhow::Error; + + fn try_from(value: VersionOrRequirement) -> Result { + let VersionOrRequirement::Requirement(requirement) = value else { + anyhow::bail!("Version or requirement was not a requirement"); + }; + Ok(requirement) + } +} + #[cfg(test)] mod tests { use crate::{download::GHDownloader, list::List};