foundry_evm_core::backend

Struct Backend

Source
pub struct Backend {
    forks: MultiFork,
    mem_db: FoundryEvmInMemoryDB,
    fork_init_journaled_state: JournaledState,
    active_fork_ids: Option<(LocalForkId, usize)>,
    inner: BackendInner,
}
Expand description

Provides the underlying revm::Database implementation.

A Backend can be initialised in two forms:

§1. Empty in-memory Database

This is the default variant: an empty revm::Database

§2. Forked Database

A revm::Database that forks off a remote client

In addition to that we support forking manually on the fly. Additional forks can be created. Each unique fork is identified by its unique ForkId. We treat forks as unique if they have the same (endpoint, block number) pair.

When it comes to testing, it’s intended that each contract will use its own Backend (Backend::clone). This way each contract uses its own encapsulated evm state. For in-memory testing, the database is just an owned revm::InMemoryDB.

Each Fork, identified by a unique id, uses completely separate storage, write operations are performed only in the fork’s own database, ForkDB.

A ForkDB consists of 2 halves:

  • everything fetched from the remote is readonly
  • all local changes (instructed by the contract) are written to the backend’s db and don’t alter the state of the remote client.

§Fork swapping

Multiple “forks” can be created Backend::create_fork(), however only 1 can be used by the db. However, their state can be hot-swapped by swapping the read half of db from one fork to another. When swapping forks (Backend::select_fork()) we also update the current Env of the EVM accordingly, so that all block.* config values match

When another for is selected DatabaseExt::select_fork() the entire storage, including JournaledState is swapped, but the storage of the caller’s and the test contract account is always cloned. This way a fork has entirely separate storage but data can still be shared across fork boundaries via stack and contract variables.

§Snapshotting

A snapshot of the current overall state can be taken at any point in time. A snapshot is identified by a unique id that’s returned when a snapshot is created. A snapshot can only be reverted once. After a successful revert, the same snapshot id cannot be used again. Reverting a snapshot replaces the current active state with the snapshot state, the snapshot is deleted afterwards, as well as any snapshots taken after the reverted snapshot, (e.g.: reverting to id 0x1 will delete snapshots with ids 0x1, 0x2, etc.)

Note: State snapshots work across fork-swaps, e.g. if fork A is currently active, then a snapshot is created before fork B is selected, then fork A will be the active fork again after reverting the snapshot.

Fields§

§forks: MultiFork

The access point for managing forks

§mem_db: FoundryEvmInMemoryDB§fork_init_journaled_state: JournaledState

The journaled_state to use to initialize new forks with

The way [revm::JournaledState] works is, that it holds the “hot” accounts loaded from the underlying Database that feeds the Account and State data to the journaled_state so it can apply changes to the state while the EVM executes.

In a way the JournaledState is something like a cache that

  1. check if account is already loaded (hot)
  2. if not load from the Database (this will then retrieve the account via RPC in forking mode)

To properly initialize we store the JournaledState before the first fork is selected (DatabaseExt::select_fork).

This will be an empty JournaledState, which will be populated with persistent accounts, See Self::update_fork_db().

§active_fork_ids: Option<(LocalForkId, usize)>

The currently active fork database

If this is set, then the Backend is currently in forking mode

§inner: BackendInner

holds additional Backend data

Implementations§

Source§

impl Backend

Source

pub fn spawn(fork: Option<CreateFork>) -> Self

Creates a new Backend with a spawned multi fork thread.

If fork is Some this will use a fork database, otherwise with an in-memory database.

Source

pub fn new(forks: MultiFork, fork: Option<CreateFork>) -> Self

Creates a new instance of Backend

If fork is Some this will use a fork database, otherwise with an in-memory database.

Prefer using spawn instead.

Source

pub(crate) fn new_with_fork( id: &ForkId, fork: Fork, journaled_state: JournaledState, ) -> Self

Creates a new instance of Backend with fork added to the fork database and sets the fork as active

Source

pub fn clone_empty(&self) -> Self

Creates a new instance with a BackendDatabase::InMemory cache layer for the CacheDB

Source

pub fn insert_account_info(&mut self, address: Address, account: AccountInfo)

Source

pub fn insert_account_storage( &mut self, address: Address, slot: U256, value: U256, ) -> Result<(), DatabaseError>

Inserts a value on an account’s storage without overriding account info

Source

pub fn replace_account_storage( &mut self, address: Address, storage: Map<U256, U256>, ) -> Result<(), DatabaseError>

Completely replace an account’s storage without overriding account info.

When forking, this causes the backend to assume a 0 value for all unset storage slots instead of trying to fetch it.

Source

pub fn state_snapshots( &self, ) -> &StateSnapshots<BackendStateSnapshot<BackendDatabaseSnapshot>>

Returns all snapshots created in this backend

Source

pub fn set_test_contract(&mut self, acc: Address) -> &mut Self

Sets the address of the DSTest contract that is being executed

This will also mark the caller as persistent and remove the persistent status from the previous test contract address

This will also grant cheatcode access to the test account

Source

pub fn set_caller(&mut self, acc: Address) -> &mut Self

Sets the caller address

Source

pub fn set_spec_id(&mut self, spec_id: SpecId) -> &mut Self

Sets the current spec id

Source

pub fn caller_address(&self) -> Option<Address>

Returns the set caller address

Source

pub fn has_state_snapshot_failure(&self) -> bool

Failures occurred in state snapshots are tracked when the state snapshot is reverted.

If an error occurs in a restored state snapshot, the test is considered failed.

This returns whether there was a reverted state snapshot that recorded an error.

Source

pub fn set_state_snapshot_failure(&mut self, has_state_snapshot_failure: bool)

Sets the state snapshot failure flag.

Source

pub(crate) fn update_fork_db( &self, active_journaled_state: &mut JournaledState, target_fork: &mut Fork, )

When creating or switching forks, we update the AccountInfo of the contract

Source

pub(crate) fn update_fork_db_contracts( &self, accounts: impl IntoIterator<Item = Address>, active_journaled_state: &mut JournaledState, target_fork: &mut Fork, )

Merges the state of all accounts from the currently active db into the given fork

Source

pub fn mem_db(&self) -> &FoundryEvmInMemoryDB

Returns the memory db used if not in forking mode

Source

pub fn is_active_fork(&self, id: LocalForkId) -> bool

Returns true if the id is currently active

Source

pub fn is_in_forking_mode(&self) -> bool

Returns true if the Backend is currently in forking mode

Source

pub fn active_fork(&self) -> Option<&Fork>

Returns the currently active Fork, if any

Source

pub fn active_fork_mut(&mut self) -> Option<&mut Fork>

Returns the currently active Fork, if any

Source

pub fn active_fork_db(&self) -> Option<&CacheDB<SharedBackend>>

Returns the currently active ForkDB, if any

Source

pub fn active_fork_db_mut(&mut self) -> Option<&mut CacheDB<SharedBackend>>

Returns the currently active ForkDB, if any

Source

pub fn db(&self) -> &dyn Database<Error = DatabaseError>

Returns the current database implementation as a &dyn value.

Source

pub fn db_mut(&mut self) -> &mut dyn Database<Error = DatabaseError>

Returns the current database implementation as a &mut dyn value.

Source

pub(crate) fn create_db_snapshot(&self) -> BackendDatabaseSnapshot

Creates a snapshot of the currently active database

Source

pub fn merged_logs(&self, logs: Vec<Log>) -> Vec<Log>

Since each Fork tracks logs separately, we need to merge them to get all of them

Source

pub(crate) fn initialize(&mut self, env: &EnvWithHandlerCfg)

Initializes settings we need to keep track of.

We need to track these mainly to prevent issues when switching between different evms

Source

fn env_with_handler_cfg(&self, env: Env) -> EnvWithHandlerCfg

Returns the EnvWithHandlerCfg with the current spec_id set.

Source

pub fn inspect<I: InspectorExt>( &mut self, env: &mut EnvWithHandlerCfg, inspector: &mut I, ) -> Result<ResultAndState>

Executes the configured test call of the env without committing state changes.

Note: in case there are any cheatcodes executed that modify the environment, this will update the given env with the new values.

Source

pub fn is_existing_precompile(&self, addr: &Address) -> bool

Returns true if the address is a precompile

Source

fn set_init_journaled_state(&mut self, journaled_state: JournaledState)

Sets the initial journaled state to use when initializing forks

Source

fn prepare_init_journal_state(&mut self) -> Result<(), BackendError>

Cleans up already loaded accounts that would be initialized without the correct data from the fork.

It can happen that an account is loaded before the first fork is selected, like getNonce(addr), which will load an empty account by default.

This account data then would not match the account data of a fork if it exists. So when the first fork is initialized we replace these accounts with the actual account as it exists on the fork.

Source

fn get_block_number_and_block_for_transaction( &self, id: LocalForkId, transaction: B256, ) -> Result<(u64, AnyRpcBlock)>

Returns the block numbers required for replaying a transaction

Source

pub fn replay_until( &mut self, id: LocalForkId, env: Env, tx_hash: B256, journaled_state: &mut JournaledState, ) -> Result<Option<Transaction<AnyTxEnvelope>>>

Replays all the transactions at the forks current block that were mined before the tx

Returns the unmined transaction that corresponds to the given tx_hash

Trait Implementations§

Source§

impl Clone for Backend

Source§

fn clone(&self) -> Backend

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Database for Backend

Source§

type Error = DatabaseError

The database error type.
Source§

fn basic( &mut self, address: Address, ) -> Result<Option<AccountInfo>, Self::Error>

Get basic account information.
Source§

fn code_by_hash(&mut self, code_hash: B256) -> Result<Bytecode, Self::Error>

Get account code by its hash.
Source§

fn storage( &mut self, address: Address, index: U256, ) -> Result<U256, Self::Error>

Get storage value of address at index.
Source§

fn block_hash(&mut self, number: u64) -> Result<B256, Self::Error>

Get block hash by block number.
Source§

impl DatabaseCommit for Backend

Source§

fn commit(&mut self, changes: Map<Address, Account>)

Commit changes to the database.
Source§

impl DatabaseExt for Backend

Source§

fn select_fork( &mut self, id: LocalForkId, env: &mut Env, active_journaled_state: &mut JournaledState, ) -> Result<()>

Select an existing fork by id. When switching forks we copy the shared state

Source§

fn roll_fork( &mut self, id: Option<LocalForkId>, block_number: u64, env: &mut Env, journaled_state: &mut JournaledState, ) -> Result<()>

This is effectively the same as Self::create_select_fork() but updating an existing ForkId that is mapped to the LocalForkId

Source§

fn load_allocs( &mut self, allocs: &BTreeMap<Address, GenesisAccount>, journaled_state: &mut JournaledState, ) -> Result<(), BackendError>

Loads the account allocs from the given allocs map into the passed [JournaledState].

Returns Ok if all accounts were successfully inserted into the journal, Err otherwise.

Source§

fn clone_account( &mut self, source: &GenesisAccount, target: &Address, journaled_state: &mut JournaledState, ) -> Result<(), BackendError>

Copies bytecode, storage, nonce and balance from the given genesis account to the target address.

Returns Ok if data was successfully inserted into the journal, Err otherwise.

Source§

fn snapshot_state( &mut self, journaled_state: &JournaledState, env: &Env, ) -> U256

Creates a new state snapshot at the current point of execution. Read more
Source§

fn revert_state( &mut self, id: U256, current_state: &JournaledState, current: &mut Env, action: RevertStateSnapshotAction, ) -> Option<JournaledState>

Reverts the snapshot if it exists Read more
Source§

fn delete_state_snapshot(&mut self, id: U256) -> bool

Deletes the state snapshot with the given id Read more
Source§

fn delete_state_snapshots(&mut self)

Deletes all state snapshots.
Source§

fn create_fork(&mut self, create_fork: CreateFork) -> Result<LocalForkId>

Creates a new fork but does not select it
Source§

fn create_fork_at_transaction( &mut self, fork: CreateFork, transaction: B256, ) -> Result<LocalForkId>

Creates a new fork but does not select it
Source§

fn roll_fork_to_transaction( &mut self, id: Option<LocalForkId>, transaction: B256, env: &mut Env, journaled_state: &mut JournaledState, ) -> Result<()>

Updates the fork to given transaction hash Read more
Source§

fn transact( &mut self, maybe_id: Option<LocalForkId>, transaction: B256, env: Env, journaled_state: &mut JournaledState, inspector: &mut dyn InspectorExt, ) -> Result<()>

Fetches the given transaction for the fork and executes it, committing the state in the DB
Source§

fn transact_from_tx( &mut self, tx: &TransactionRequest, env: Env, journaled_state: &mut JournaledState, inspector: &mut dyn InspectorExt, ) -> Result<()>

Executes a given TransactionRequest, commits the new state to the DB
Source§

fn active_fork_id(&self) -> Option<LocalForkId>

Returns the ForkId that’s currently used in the database, if fork mode is on
Source§

fn active_fork_url(&self) -> Option<String>

Returns the Fork url that’s currently used in the database, if fork mode is on
Source§

fn ensure_fork(&self, id: Option<LocalForkId>) -> Result<LocalForkId>

Ensures that an appropriate fork exists Read more
Source§

fn ensure_fork_id(&self, id: LocalForkId) -> Result<&ForkId>

Ensures that a corresponding ForkId exists for the given local id
Source§

fn diagnose_revert( &self, callee: Address, journaled_state: &JournaledState, ) -> Option<RevertDiagnostic>

Handling multiple accounts/new contracts in a multifork environment can be challenging since every fork has its own standalone storage section. So this can be a common error to run into: Read more
Source§

fn add_persistent_account(&mut self, account: Address) -> bool

Marks the given account as persistent.
Source§

fn remove_persistent_account(&mut self, account: &Address) -> bool

Revokes persistent status from the given account.
Source§

fn is_persistent(&self, acc: &Address) -> bool

Returns true if the given account is currently marked as persistent.
Source§

fn allow_cheatcode_access(&mut self, account: Address) -> bool

Grants cheatcode access for the given account Read more
Source§

fn revoke_cheatcode_access(&mut self, account: &Address) -> bool

Revokes cheatcode access for the given account Read more
Source§

fn has_cheatcode_access(&self, account: &Address) -> bool

Returns true if the given account is allowed to execute cheatcodes
Source§

fn set_blockhash(&mut self, block_number: U256, block_hash: B256)

Set the blockhash for a given block number. Read more
Source§

fn create_select_fork( &mut self, fork: CreateFork, env: &mut Env, journaled_state: &mut JournaledState, ) -> Result<LocalForkId>

Creates and also selects a new fork Read more
Source§

fn create_select_fork_at_transaction( &mut self, fork: CreateFork, env: &mut Env, journaled_state: &mut JournaledState, transaction: B256, ) -> Result<LocalForkId>

Creates and also selects a new fork Read more
Source§

fn is_forked_mode(&self) -> bool

Whether the database is currently in forked mode.
Source§

fn remove_persistent_accounts( &mut self, accounts: impl IntoIterator<Item = Address>, )
where Self: Sized,

Removes persistent status from all given accounts.
Source§

fn extend_persistent_accounts( &mut self, accounts: impl IntoIterator<Item = Address>, )
where Self: Sized,

Extends the persistent accounts with the accounts the iterator yields.
Source§

fn ensure_cheatcode_access(&self, account: &Address) -> Result<(), BackendError>

Ensures that account is allowed to execute cheatcodes Read more
Source§

fn ensure_cheatcode_access_forking_mode( &self, account: &Address, ) -> Result<(), BackendError>

Same as Self::ensure_cheatcode_access() but only enforces it if the backend is currently in forking mode
Source§

impl DatabaseRef for Backend

Source§

type Error = DatabaseError

The database error type.
Source§

fn basic_ref( &self, address: Address, ) -> Result<Option<AccountInfo>, Self::Error>

Get basic account information.
Source§

fn code_by_hash_ref(&self, code_hash: B256) -> Result<Bytecode, Self::Error>

Get account code by its hash.
Source§

fn storage_ref( &self, address: Address, index: U256, ) -> Result<U256, Self::Error>

Get storage value of address at index.
Source§

fn block_hash_ref(&self, number: u64) -> Result<B256, Self::Error>

Get block hash by block number.
Source§

impl Debug for Backend

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<T, R> CollectAndApply<T, R> for T

§

fn collect_and_apply<I, F>(iter: I, f: F) -> R
where I: Iterator<Item = T>, F: FnOnce(&[T]) -> R,

Equivalent to f(&iter.collect::<Vec<_>>()).

§

type Output = R

§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> DynClone for T
where T: Clone,

§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> Paint for T
where T: ?Sized,

§

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();
§

fn primary(&self) -> Painted<&T>

Returns self with the fg() set to [Color::Primary].

§Example
println!("{}", value.primary());
§

fn fixed(&self, color: u8) -> Painted<&T>

Returns self with the fg() set to [Color::Fixed].

§Example
println!("{}", value.fixed(color));
§

fn rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the fg() set to [Color::Rgb].

§Example
println!("{}", value.rgb(r, g, b));
§

fn black(&self) -> Painted<&T>

Returns self with the fg() set to [Color::Black].

§Example
println!("{}", value.black());
§

fn red(&self) -> Painted<&T>

Returns self with the fg() set to [Color::Red].

§Example
println!("{}", value.red());
§

fn green(&self) -> Painted<&T>

Returns self with the fg() set to [Color::Green].

§Example
println!("{}", value.green());
§

fn yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color::Yellow].

§Example
println!("{}", value.yellow());
§

fn blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color::Blue].

§Example
println!("{}", value.blue());
§

fn magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color::Magenta].

§Example
println!("{}", value.magenta());
§

fn cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color::Cyan].

§Example
println!("{}", value.cyan());
§

fn white(&self) -> Painted<&T>

Returns self with the fg() set to [Color::White].

§Example
println!("{}", value.white());
§

fn bright_black(&self) -> Painted<&T>

Returns self with the fg() set to [Color::BrightBlack].

§Example
println!("{}", value.bright_black());
§

fn bright_red(&self) -> Painted<&T>

Returns self with the fg() set to [Color::BrightRed].

§Example
println!("{}", value.bright_red());
§

fn bright_green(&self) -> Painted<&T>

Returns self with the fg() set to [Color::BrightGreen].

§Example
println!("{}", value.bright_green());
§

fn bright_yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color::BrightYellow].

§Example
println!("{}", value.bright_yellow());
§

fn bright_blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color::BrightBlue].

§Example
println!("{}", value.bright_blue());
§

fn bright_magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color::BrightMagenta].

§Example
println!("{}", value.bright_magenta());
§

fn bright_cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color::BrightCyan].

§Example
println!("{}", value.bright_cyan());
§

fn bright_white(&self) -> Painted<&T>

Returns self with the fg() set to [Color::BrightWhite].

§Example
println!("{}", value.bright_white());
§

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();
§

fn on_primary(&self) -> Painted<&T>

Returns self with the bg() set to [Color::Primary].

§Example
println!("{}", value.on_primary());
§

fn on_fixed(&self, color: u8) -> Painted<&T>

Returns self with the bg() set to [Color::Fixed].

§Example
println!("{}", value.on_fixed(color));
§

fn on_rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the bg() set to [Color::Rgb].

§Example
println!("{}", value.on_rgb(r, g, b));
§

fn on_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color::Black].

§Example
println!("{}", value.on_black());
§

fn on_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color::Red].

§Example
println!("{}", value.on_red());
§

fn on_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color::Green].

§Example
println!("{}", value.on_green());
§

fn on_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color::Yellow].

§Example
println!("{}", value.on_yellow());
§

fn on_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color::Blue].

§Example
println!("{}", value.on_blue());
§

fn on_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color::Magenta].

§Example
println!("{}", value.on_magenta());
§

fn on_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color::Cyan].

§Example
println!("{}", value.on_cyan());
§

fn on_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color::White].

§Example
println!("{}", value.on_white());
§

fn on_bright_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color::BrightBlack].

§Example
println!("{}", value.on_bright_black());
§

fn on_bright_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color::BrightRed].

§Example
println!("{}", value.on_bright_red());
§

fn on_bright_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color::BrightGreen].

§Example
println!("{}", value.on_bright_green());
§

fn on_bright_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color::BrightYellow].

§Example
println!("{}", value.on_bright_yellow());
§

fn on_bright_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color::BrightBlue].

§Example
println!("{}", value.on_bright_blue());
§

fn on_bright_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color::BrightMagenta].

§Example
println!("{}", value.on_bright_magenta());
§

fn on_bright_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color::BrightCyan].

§Example
println!("{}", value.on_bright_cyan());
§

fn on_bright_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color::BrightWhite].

§Example
println!("{}", value.on_bright_white());
§

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();
§

fn bold(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute::Bold].

§Example
println!("{}", value.bold());
§

fn dim(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute::Dim].

§Example
println!("{}", value.dim());
§

fn italic(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute::Italic].

§Example
println!("{}", value.italic());
§

fn underline(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute::Underline].

§Example
println!("{}", value.underline());

Returns self with the attr() set to [Attribute::Blink].

§Example
println!("{}", value.blink());

Returns self with the attr() set to [Attribute::RapidBlink].

§Example
println!("{}", value.rapid_blink());
§

fn invert(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute::Invert].

§Example
println!("{}", value.invert());
§

fn conceal(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute::Conceal].

§Example
println!("{}", value.conceal());
§

fn strike(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute::Strike].

§Example
println!("{}", value.strike());
§

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();
§

fn mask(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk::Mask].

§Example
println!("{}", value.mask());
§

fn wrap(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk::Wrap].

§Example
println!("{}", value.wrap());
§

fn linger(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk::Linger].

§Example
println!("{}", value.linger());
§

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.

Returns self with the quirk() set to [Quirk::Clear].

§Example
println!("{}", value.clear());
§

fn resetting(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk::Resetting].

§Example
println!("{}", value.resetting());
§

fn bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk::Bright].

§Example
println!("{}", value.bright());
§

fn on_bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk::OnBright].

§Example
println!("{}", value.on_bright());
§

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);
§

fn new(self) -> Painted<Self>
where Self: Sized,

Create a new [Painted] with a default [Style]. Read more
§

fn paint<S>(&self, style: S) -> Painted<&Self>
where S: Into<Style>,

Apply a style wholesale to self. Any previous style is replaced. Read more
§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T> TryClone for T
where T: Clone,

§

fn try_clone(&self) -> Result<T, Error>

Clones self, possibly returning an error.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> MaybeSendSync for T

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 816 bytes