pub struct ProjectPathsConfig {
pub root: PathBuf,
pub cache: PathBuf,
pub artifacts: PathBuf,
pub build_infos: PathBuf,
pub sources: PathBuf,
pub tests: PathBuf,
pub scripts: PathBuf,
pub libraries: Vec<PathBuf>,
pub remappings: Vec<Remapping>,
}
solc
only.Expand description
Where to find all files or where to write them
Fields§
§root: PathBuf
Project root
cache: PathBuf
Path to the cache, if any
artifacts: PathBuf
Where to store build artifacts
build_infos: PathBuf
Where to store the build info files
sources: PathBuf
Where to find sources
tests: PathBuf
Where to find tests
scripts: PathBuf
Where to find scripts
libraries: Vec<PathBuf>
Where to look for libraries
remappings: Vec<Remapping>
The compiler remappings
Implementations§
Source§impl ProjectPathsConfig
impl ProjectPathsConfig
pub fn builder() -> ProjectPathsConfigBuilder
Sourcepub fn hardhat(root: impl AsRef<Path>) -> Result<ProjectPathsConfig, SolcError>
pub fn hardhat(root: impl AsRef<Path>) -> Result<ProjectPathsConfig, SolcError>
Creates a new hardhat style config instance which points to the canonicalized root path
Sourcepub fn dapptools(
root: impl AsRef<Path>,
) -> Result<ProjectPathsConfig, SolcError>
pub fn dapptools( root: impl AsRef<Path>, ) -> Result<ProjectPathsConfig, SolcError>
Creates a new dapptools style config instance which points to the canonicalized root path
Sourcepub fn current_hardhat() -> Result<ProjectPathsConfig, SolcError>
pub fn current_hardhat() -> Result<ProjectPathsConfig, SolcError>
Creates a new config with the current directory as the root
Sourcepub fn current_dapptools() -> Result<ProjectPathsConfig, SolcError>
pub fn current_dapptools() -> Result<ProjectPathsConfig, SolcError>
Creates a new config with the current directory as the root
Sourcepub fn paths(&self) -> ProjectPaths
pub fn paths(&self) -> ProjectPaths
Returns a new ProjectPaths instance that contains all directories configured for this project
Sourcepub fn paths_relative(&self) -> ProjectPaths
pub fn paths_relative(&self) -> ProjectPaths
Same as paths
but strips the root
form all paths.
Sourcepub fn create_all(&self) -> Result<(), SolcIoError>
pub fn create_all(&self) -> Result<(), SolcIoError>
Creates all configured dirs and files
Sourcepub fn read_sources(&self) -> Result<BTreeMap<PathBuf, Source>, SolcError>
pub fn read_sources(&self) -> Result<BTreeMap<PathBuf, Source>, SolcError>
Returns all sources found under the project’s configured sources
path
Sourcepub fn read_tests(&self) -> Result<BTreeMap<PathBuf, Source>, SolcError>
pub fn read_tests(&self) -> Result<BTreeMap<PathBuf, Source>, SolcError>
Returns all sources found under the project’s configured test
path
Sourcepub fn read_scripts(&self) -> Result<BTreeMap<PathBuf, Source>, SolcError>
pub fn read_scripts(&self) -> Result<BTreeMap<PathBuf, Source>, SolcError>
Returns all sources found under the project’s configured script
path
Sourcepub fn has_input_files(&self) -> bool
pub fn has_input_files(&self) -> bool
Returns true if the there is at least one solidity file in this config.
See also, Self::input_files()
Sourcepub fn input_files_iter(&self) -> impl Iterator<Item = PathBuf>
pub fn input_files_iter(&self) -> impl Iterator<Item = PathBuf>
Returns an iterator that yields all solidity file paths for Self::sources
, Self::tests
and Self::scripts
Sourcepub fn input_files(&self) -> Vec<PathBuf>
pub fn input_files(&self) -> Vec<PathBuf>
Returns the combined set solidity file paths for Self::sources
, Self::tests
and
Self::scripts
Sourcepub fn read_input_files(&self) -> Result<BTreeMap<PathBuf, Source>, SolcError>
pub fn read_input_files(&self) -> Result<BTreeMap<PathBuf, Source>, SolcError>
Returns the combined set of Self::read_sources
+ Self::read_tests
+ Self::read_scripts
Sourcepub fn slash_paths(&mut self)
pub fn slash_paths(&mut self)
Converts all \\
separators in all paths to /
Sourcepub fn has_library_ancestor(&self, file: impl AsRef<Path>) -> bool
pub fn has_library_ancestor(&self, file: impl AsRef<Path>) -> bool
Returns true if the file
belongs to a library
, See Self::find_library_ancestor()
Sourcepub fn find_library_ancestor(&self, file: impl AsRef<Path>) -> Option<&PathBuf>
pub fn find_library_ancestor(&self, file: impl AsRef<Path>) -> Option<&PathBuf>
Returns the library the file belongs to
Returns the first library that is an ancestor of the given file
.
Note: this does not resolve remappings Self::resolve_import()
, instead this merely
checks if a library
is a parent of file
§Example
use std::path::Path;
use ethers_solc::ProjectPathsConfig;
let config = ProjectPathsConfig::builder().lib("lib").build().unwrap();
assert_eq!(config.find_library_ancestor("lib/src/Greeter.sol").unwrap(), Path::new("lib"));
Sourcepub fn resolve_import_and_include_paths(
&self,
cwd: &Path,
import: &Path,
include_paths: &mut IncludePaths,
) -> Result<PathBuf, SolcError>
pub fn resolve_import_and_include_paths( &self, cwd: &Path, import: &Path, include_paths: &mut IncludePaths, ) -> Result<PathBuf, SolcError>
Attempts to resolve an import
from the given working directory.
The cwd
path is the parent dir of the file that includes the import
This will also populate the include_paths
with any nested library root paths that should
be provided to solc via --include-path
because it uses absolute imports.
Sourcepub fn resolve_import(
&self,
cwd: &Path,
import: &Path,
) -> Result<PathBuf, SolcError>
pub fn resolve_import( &self, cwd: &Path, import: &Path, ) -> Result<PathBuf, SolcError>
Attempts to resolve an import
from the given working directory.
The cwd
path is the parent dir of the file that includes the import
Sourcepub fn resolve_library_import(
&self,
cwd: &Path,
import: &Path,
) -> Option<PathBuf>
pub fn resolve_library_import( &self, cwd: &Path, import: &Path, ) -> Option<PathBuf>
Attempts to find the path to the real solidity file that’s imported via the given import
path by applying the configured remappings and checking the library dirs
§Example
Following @aave
dependency in the lib
folder node_modules
<root>/node_modules/@aave
├── aave-token
│ ├── contracts
│ │ ├── open-zeppelin
│ │ ├── token
├── governance-v2
├── contracts
├── interfaces
has this remapping: @aave/=@aave/
(name:path) so contracts can be imported as
import "@aave/governance-v2/contracts/governance/Executor.sol";
So that Executor.sol
can be found by checking each lib
folder (node_modules
) with
applied remappings. Applying remapping works by checking if the import path of an import
statement starts with the name of a remapping and replacing it with the remapping’s path
.
There are some caveats though, dapptools style remappings usually include the src
folder
ds-test/=lib/ds-test/src/
so that imports look like import "ds-test/test.sol";
(note the
missing src
in the import path).
For hardhat/npm style that’s not always the case, most notably for openzeppelin-contracts if installed via npm.
The remapping is detected as '@openzeppelin/=node_modules/@openzeppelin/contracts/'
, which
includes the source directory contracts
, however it’s common to see import paths like:
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
instead of
import "@openzeppelin/token/ERC20/IERC20.sol";
There is no strict rule behind this, but because crate::remappings::Remapping::find_many
returns '@openzeppelin/=node_modules/@openzeppelin/contracts/'
we should handle the
case if the remapping path ends with /contracts/
and the import path starts with
<remapping name>/contracts/
. Otherwise we can end up with a resolved path that has a
duplicate contracts
segment:
@openzeppelin/contracts/contracts/token/ERC20/IERC20.sol
we check for this edge case
here so that both styles work out of the box.
Sourcepub fn find_artifacts_dir(root: impl AsRef<Path>) -> PathBuf
pub fn find_artifacts_dir(root: impl AsRef<Path>) -> PathBuf
Attempts to autodetect the artifacts directory based on the given root path
Dapptools layout takes precedence over hardhat style. This will return:
<root>/out
if it exists or<root>/artifacts
does not exist,<root>/artifacts
if it exists and<root>/out
does not exist.
Sourcepub fn find_source_dir(root: impl AsRef<Path>) -> PathBuf
pub fn find_source_dir(root: impl AsRef<Path>) -> PathBuf
Attempts to autodetect the source directory based on the given root path
Dapptools layout takes precedence over hardhat style. This will return:
<root>/src
if it exists or<root>/contracts
does not exist,<root>/contracts
if it exists and<root>/src
does not exist.
Sourcepub fn find_libs(root: impl AsRef<Path>) -> Vec<PathBuf>
pub fn find_libs(root: impl AsRef<Path>) -> Vec<PathBuf>
Attempts to autodetect the lib directory based on the given root path
Dapptools layout takes precedence over hardhat style. This will return:
<root>/lib
if it exists or<root>/node_modules
does not exist,<root>/node_modules
if it exists and<root>/lib
does not exist.
Trait Implementations§
Source§impl Clone for ProjectPathsConfig
impl Clone for ProjectPathsConfig
Source§fn clone(&self) -> ProjectPathsConfig
fn clone(&self) -> ProjectPathsConfig
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for ProjectPathsConfig
impl Debug for ProjectPathsConfig
Source§impl<'de> Deserialize<'de> for ProjectPathsConfig
impl<'de> Deserialize<'de> for ProjectPathsConfig
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<ProjectPathsConfig, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<ProjectPathsConfig, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl Display for ProjectPathsConfig
impl Display for ProjectPathsConfig
Source§impl<'a> From<&'a ProjectPathsConfig> for SolFilesCache
impl<'a> From<&'a ProjectPathsConfig> for SolFilesCache
Source§fn from(config: &'a ProjectPathsConfig) -> SolFilesCache
fn from(config: &'a ProjectPathsConfig) -> SolFilesCache
Source§impl Serialize for ProjectPathsConfig
impl Serialize for ProjectPathsConfig
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
Auto Trait Implementations§
impl Freeze for ProjectPathsConfig
impl RefUnwindSafe for ProjectPathsConfig
impl Send for ProjectPathsConfig
impl Sync for ProjectPathsConfig
impl Unpin for ProjectPathsConfig
impl UnwindSafe for ProjectPathsConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.