Struct foundry_compilers::ProjectPathsConfig
source · pub struct ProjectPathsConfig<L = MultiCompilerLanguage> {
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>,
pub include_paths: BTreeSet<PathBuf>,
pub allowed_paths: BTreeSet<PathBuf>,
pub _l: PhantomData<L>,
}
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
include_paths: BTreeSet<PathBuf>
Paths to use for solc’s --include-path
allowed_paths: BTreeSet<PathBuf>
The paths which will be allowed for library inclusion
_l: PhantomData<L>
Implementations§
source§impl ProjectPathsConfig
impl ProjectPathsConfig
pub fn builder() -> ProjectPathsConfigBuilder
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.
source§impl ProjectPathsConfig<SolcLanguage>
impl ProjectPathsConfig<SolcLanguage>
sourcepub fn flatten(&self, target: &Path) -> Result<String>
pub fn flatten(&self, target: &Path) -> Result<String>
Flattens the target solidity file into a single string suitable for verification.
This method uses a dependency graph to resolve imported files and substitute import directives with the contents of target files. It will strip the pragma version directives and SDPX license identifiers from all imported files.
NB: the SDPX license identifier will be removed from the imported file only if it is found at the beginning of the file.
source§impl<L> ProjectPathsConfig<L>
impl<L> ProjectPathsConfig<L>
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 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 BTreeSet<PathBuf>,
) -> Result<PathBuf>
pub fn resolve_import_and_include_paths( &self, cwd: &Path, import: &Path, include_paths: &mut BTreeSet<PathBuf>, ) -> 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.
pub fn with_language<Lang>(self) -> ProjectPathsConfig<Lang>
source§impl<L: Language> ProjectPathsConfig<L>
impl<L: Language> ProjectPathsConfig<L>
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
Trait Implementations§
source§impl<L: Clone> Clone for ProjectPathsConfig<L>
impl<L: Clone> Clone for ProjectPathsConfig<L>
source§fn clone(&self) -> ProjectPathsConfig<L>
fn clone(&self) -> ProjectPathsConfig<L>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<L: Debug> Debug for ProjectPathsConfig<L>
impl<L: Debug> Debug for ProjectPathsConfig<L>
source§impl<'de, L> Deserialize<'de> for ProjectPathsConfig<L>
impl<'de, L> Deserialize<'de> for ProjectPathsConfig<L>
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, S: CompilerSettings> From<&'a ProjectPathsConfig> for CompilerCache<S>
impl<'a, S: CompilerSettings> From<&'a ProjectPathsConfig> for CompilerCache<S>
source§fn from(config: &'a ProjectPathsConfig) -> Self
fn from(config: &'a ProjectPathsConfig) -> Self
Auto Trait Implementations§
impl<L> Freeze for ProjectPathsConfig<L>
impl<L> RefUnwindSafe for ProjectPathsConfig<L>where
L: RefUnwindSafe,
impl<L> Send for ProjectPathsConfig<L>where
L: Send,
impl<L> Sync for ProjectPathsConfig<L>where
L: Sync,
impl<L> Unpin for ProjectPathsConfig<L>where
L: Unpin,
impl<L> UnwindSafe for ProjectPathsConfig<L>where
L: UnwindSafe,
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 moresource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the foreground set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red()
and
green()
, which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg()
:
use yansi::{Paint, Color};
painted.fg(Color::White);
Set foreground color to white using white()
.
use yansi::Paint;
painted.white();
source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightBlack
.
§Example
println!("{}", value.bright_black());
source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightGreen
.
§Example
println!("{}", value.bright_green());
source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightYellow
.
§Example
println!("{}", value.bright_yellow());
source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightMagenta
.
§Example
println!("{}", value.bright_magenta());
source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightWhite
.
§Example
println!("{}", value.bright_white());
source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the background set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red()
and
on_green()
, which have the same functionality but
are pithier.
§Example
Set background color to red using fg()
:
use yansi::{Paint, Color};
painted.bg(Color::Red);
Set background color to red using on_red()
.
use yansi::Paint;
painted.on_red();
source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlack
.
§Example
println!("{}", value.on_bright_black());
source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightGreen
.
§Example
println!("{}", value.on_bright_green());
source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightYellow
.
§Example
println!("{}", value.on_bright_yellow());
source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlue
.
§Example
println!("{}", value.on_bright_blue());
source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightMagenta
.
§Example
println!("{}", value.on_bright_magenta());
source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightCyan
.
§Example
println!("{}", value.on_bright_cyan());
source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightWhite
.
§Example
println!("{}", value.on_bright_white());
source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute
value
.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold()
and
underline()
, which have the same functionality
but are pithier.
§Example
Make text bold using attr()
:
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);
Make text bold using using bold()
.
use yansi::Paint;
painted.bold();
source§fn underline(&self) -> Painted<&T>
fn underline(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::Underline
.
§Example
println!("{}", value.underline());
source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::RapidBlink
.
§Example
println!("{}", value.rapid_blink());
source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi
Quirk
value
.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask()
and
wrap()
, which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk()
:
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);
Enable wrapping using wrap()
.
use yansi::Paint;
painted.wrap();
source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition
value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted
only when both stdout
and stderr
are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);