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>,
}
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<Self>
pub fn hardhat(root: impl AsRef<Path>) -> Result<Self>
Creates a new hardhat style config instance which points to the canonicalized root path
Sourcepub fn dapptools(root: impl AsRef<Path>) -> Result<Self>
pub fn dapptools(root: impl AsRef<Path>) -> Result<Self>
Creates a new dapptools style config instance which points to the canonicalized root path
Sourcepub fn current_hardhat() -> Result<Self>
pub fn current_hardhat() -> Result<Self>
Creates a new config with the current directory as the root
Sourcepub fn current_dapptools() -> Result<Self>
pub fn current_dapptools() -> Result<Self>
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<Sources>
pub fn read_sources(&self) -> Result<Sources>
Returns all sources found under the project’s configured sources
path
Sourcepub fn read_tests(&self) -> Result<Sources>
pub fn read_tests(&self) -> Result<Sources>
Returns all sources found under the project’s configured test
path
Sourcepub fn read_scripts(&self) -> Result<Sources>
pub fn read_scripts(&self) -> Result<Sources>
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<Sources>
pub fn read_input_files(&self) -> Result<Sources>
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>
pub fn resolve_import_and_include_paths( &self, cwd: &Path, import: &Path, include_paths: &mut IncludePaths, ) -> Result<PathBuf>
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>
pub fn resolve_import(&self, cwd: &Path, import: &Path) -> Result<PathBuf>
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<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::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) -> Self
fn from(config: &'a ProjectPathsConfig) -> Self
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> 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 more