Struct foundry_compilers::ProjectPathsConfig
source · 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: PathBufProject root
cache: PathBufPath to the cache, if any
artifacts: PathBufWhere to store build artifacts
build_infos: PathBufWhere to store the build info files
sources: PathBufWhere to find sources
tests: PathBufWhere to find tests
scripts: PathBufWhere 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<&Path>
pub fn find_library_ancestor(&self, file: impl AsRef<Path>) -> Option<&Path>
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
§Examples
use foundry_compilers::ProjectPathsConfig;
use std::path::Path;
let config = ProjectPathsConfig::builder().lib("lib").build()?;
assert_eq!(config.find_library_ancestor("lib/src/Greeter.sol"), Some(Path::new("lib")));
Ok::<_, Box<dyn std::error::Error>>(())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
§Examples
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>/outif it exists or<root>/artifactsdoes not exist,<root>/artifactsif it exists and<root>/outdoes 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>/srcif it exists or<root>/contractsdoes not exist,<root>/contractsif it exists and<root>/srcdoes 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>/libif it exists or<root>/node_modulesdoes not exist,<root>/node_modulesif it exists and<root>/libdoes 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> 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