Skip to main content

NodeTestContext

Struct NodeTestContext 

Source
pub struct NodeTestContext<Node, AddOns>
where Node: FullNodeComponents, AddOns: RethRpcAddOns<Node>,
{ pub inner: FullNode<Node, AddOns>, pub payload: PayloadTestContext<<Node::Types as NodeTypes>::Payload>, pub network: NetworkTestContext<Node::Network>, pub rpc: RpcTestContext<Node, AddOns::EthApi>, pub engine: EngineTestContext<<Node::Types as NodeTypes>::Payload>, pub canonical_stream: CanonStateNotificationStream<PrimitivesTy<Node::Types>>, /* private fields */ }
Expand description

A helper struct to handle node actions

Fields§

§inner: FullNode<Node, AddOns>

The core structure representing the full node.

§payload: PayloadTestContext<<Node::Types as NodeTypes>::Payload>

Context for testing payload-related features.

§network: NetworkTestContext<Node::Network>

Context for testing network functionalities.

§rpc: RpcTestContext<Node, AddOns::EthApi>

Context for testing RPC features.

§engine: EngineTestContext<<Node::Types as NodeTypes>::Payload>

Context for sending payloads and forkchoice updates to the engine independent of the Engine API version.

§canonical_stream: CanonStateNotificationStream<PrimitivesTy<Node::Types>>

Canonical state events.

Implementations§

Source§

impl<Node, Payload, AddOns> NodeTestContext<Node, AddOns>
where Payload: PayloadTypes, Node: FullNodeComponents, Node::Types: NodeTypes<ChainSpec: EthereumHardforks, Payload = Payload>, Node::Network: PeersHandleProvider, AddOns: RethRpcAddOns<Node>,

Source

pub async fn new( node: FullNode<Node, AddOns>, attributes_generator: impl Fn(u64) -> Payload::PayloadAttributes + Send + Sync + 'static, ) -> Result<Self>

Creates a new test node

Payload timestamps start after the default Cancun timestamp of the payload context, or after the timestamp of the latest block if it is newer, e.g. for a custom genesis or an imported chain.

Source

pub async fn connect(&mut self, node: &mut Self)

Establish a connection to the node

Source

pub async fn advance( &mut self, length: u64, tx_generator: impl Fn(u64) -> Pin<Box<dyn Future<Output = Bytes>>>, ) -> Result<Vec<Payload::BuiltPayload>>
where AddOns::EthApi: EthApiSpec<Provider: BlockReader<Block = BlockTy<Node::Types>>> + EthTransactions + TraceExt,

Advances the chain length blocks.

Returns the added chain as a Vec of block hashes.

Source

pub fn inject_and_advance( &mut self, raw_tx: Bytes, ) -> BoxFuture<'_, Result<(B256, Payload::BuiltPayload)>>
where AddOns::EthApi: EthApiSpec<Provider: BlockReader<Block = BlockTy<Node::Types>>> + EthTransactions + TraceExt,

Injects the raw transaction into the pool, advances the node one block and waits until the block is committed, returning the transaction hash and the built payload.

Returns an error if the transaction is not included in the block, see Self::assert_new_block.

Source

pub fn current_forkchoice_state(&self) -> Result<ForkchoiceState>

Returns the current forkchoice state of the node.

Source

pub fn set_next_payload_timestamp(&mut self, timestamp: u64) -> Result<()>

Sets the timestamp of the next payload built by Self::new_payload and the methods built on it, such as Self::advance_block.

Later payloads continue from this timestamp, one second apart. The attributes generator is called with the new timestamp, so fork-dependent attributes follow it.

Returns an error if the timestamp is not greater than the timestamp of the current latest block, which is the parent of the next payload.

Source

pub async fn new_payload(&mut self) -> Result<Payload::BuiltPayload>

Builds a payload on top of the latest block and returns it without submitting it to the engine.

Sends a forkchoice update with the next payload attributes, see Self::set_next_payload_timestamp, and resolves the payload job it starts with PayloadKind::WaitForPending, which waits for the build in progress instead of returning an empty payload. The payload can still contain no transactions, e.g. if the pool had none when the build started. Payload jobs started by others, e.g. by forkchoice updates with payload attributes sent by the test, do not affect this.

Returns an error if the forkchoice update fails or starts no payload job, e.g. because the engine is syncing, or if the payload job fails to build a payload.

Source

pub async fn build_and_submit_payload( &mut self, ) -> Result<Payload::BuiltPayload>

Triggers payload building job and submits it to the engine.

Returns an error if the engine reports the payload invalid, see Self::submit_payload.

Source

pub async fn advance_block(&mut self) -> Result<Payload::BuiltPayload>

Advances the node forward one block by building a payload and importing it with Self::import_payload.

The block becomes the head, the safe and finalized blocks follow the Finality policy of the context.

Source

pub async fn advance_block_synced(&mut self) -> Result<Payload::BuiltPayload>

Advances the node forward one block like Self::advance_block and waits until the transaction pool processed the new block, see Self::wait_for_pool_head.

This only waits for the canonical state update of the pool itself, which removes the transactions mined in the block and updates sender nonces and pending fees. Nodes that run additional pool maintenance tasks on new blocks have to wait for the expected contents of the pool instead, e.g. with Self::wait_for_pool_removal for the mined transactions.

Source

pub async fn advance_blocks( &mut self, length: u64, ) -> Result<Vec<Payload::BuiltPayload>>

Advances the chain length blocks, see Self::advance_block.

Unlike Self::advance, this does not inject transactions, so the blocks include the pending transactions of the pool, if any.

Returns the built payloads.

Source

pub async fn build_payload_on( &mut self, parent: B256, ) -> Result<Payload::BuiltPayload>

Builds a payload on the block with the given hash with the next payload attributes and returns it without submitting it, like Self::new_payload does for the head.

The payload job is started with a forkchoice update to parent that keeps the safe and finalized blocks of the node. Its effect depends on parent:

  • The head, or a canonical ancestor of it that is not below the finalized block: the head stays, the engine builds on parent without changing the canonical chain. The exception is a tree config with both always_process_payload_attributes_on_canonical_head and unwind_canonical_header, under which the engine moves the head back to an ancestor.
  • A block on a side chain: the engine first makes the side chain canonical, so parent becomes the head, reorging the chain.
  • A canonical block below the finalized block, or a side chain block that does not descend from the finalized block: the engine rejects the update and this returns an error, the head stays. Blocks imported under Finality::Head are finalized, import them under Finality::Keep or Finality::Lag to build on them later, see Self::set_finality.
  • A block the node does not know: the engine starts no payload job and requests the block from its peers, and this returns an error.

The payload includes transactions of the pool, which tracks the head: transactions mined in the blocks above parent are not in the pool anymore, so the payload does not include them, and pool transactions that are invalid on parent are skipped.

Source

pub async fn advance_block_on( &mut self, parent: B256, ) -> Result<Payload::BuiltPayload>

Builds a block on the block with the given hash and imports it with Self::import_payload, so it becomes the head.

If parent is not the head, this reorgs the chain, so parent must be the finalized block or descend from it, see Self::build_payload_on. The safe and finalized blocks follow the Finality policy of the context. The transaction pool processes the reorg in the background, see Self::reorg_to.

Source

pub async fn advance_fork( &mut self, parent: B256, length: u64, ) -> Result<Vec<Payload::BuiltPayload>>

Builds a chain of length blocks on the block with the given hash and makes its tip the head, see Self::advance_block_on.

The first block is built on parent and each further block on the previous one, so this reorgs the chain if parent is not the head. Returns the built payloads, does nothing for a length of 0.

Source

pub fn advance_until_receipt( &mut self, hash: B256, ) -> BoxFuture<'_, Result<RpcReceipt<<AddOns::EthApi as EthApiTypes>::NetworkTypes>>>
where AddOns::EthApi: EthApiSpec<Provider: BlockReader<Block = BlockTy<Node::Types>>> + EthTransactions + TraceExt + LoadReceipt + 'static,

Advances the chain one block at a time until the transaction with the given hash is included in a canonical block, returning its receipt.

Returns the receipt without advancing if the transaction is already included. Returns an error if the transaction is not included within WAIT_TIMEOUT.

Source

pub async fn advance_until_pool_drained( &mut self, ) -> Result<Vec<Payload::BuiltPayload>>

Advances the chain one block at a time until the transaction pool has no pending transactions left, returning the built payloads.

Pending transactions are the ones the pool considers ready for the next block, which the payload builder picks from. This does not wait for the other transactions of the pool, which stay in it: queued transactions, e.g. behind a nonce gap, and transactions whose fee cap is below the base fee or blob fee of the next block. Transactions that become pending once a built block is processed, e.g. because it lowered the base fee, are included in the following blocks. The pool decides when to stop, not the content of the blocks, since payload builders can add transactions of their own that are not pool transactions.

The pool processes new blocks in the background, so this waits until it processed the current head before it looks at the pool, see Self::wait_for_pool_head, and advances with Self::advance_block_synced. No block is built once the pool has no pending transactions: the last payload is the block after which none were left, not an extra empty block, and no payload is returned if the pool has none to begin with.

Returns an error if the pool does not process the current head within WAIT_TIMEOUT, e.g. because it was synced by backfill, or, listing them, if pending transactions are left after WAIT_TIMEOUT, e.g. because the payload builder skips them.

Source

pub async fn advance_while<F: Future>(&mut self, fut: F) -> Result<F::Output>

Drives fut to completion while advancing the chain one block every POLL_INTERVAL, returning its output.

This is useful for futures that only complete once their transaction is mined, e.g. an eth_sendRawTransactionSync request. fut is also polled while a block is built, but the block is always built to completion, so the chain may advance one more block after fut completed.

Returns an error if fut does not complete within WAIT_TIMEOUT.

Source

pub fn mine( &mut self, txs: impl IntoIterator<Item = Bytes>, ) -> MinedBlockFuture<'_, Payload::BuiltPayload, RpcReceipt<<AddOns::EthApi as EthApiTypes>::NetworkTypes>>
where Payload::BuiltPayload: BuiltPayload<Primitives = PrimitivesTy<Node::Types>>, AddOns::EthApi: EthApiSpec<Provider: BlockReader<Block = BlockTy<Node::Types>>> + EthTransactions + TraceExt + LoadReceipt + 'static,

Injects the raw transactions into the pool in the given order, advances the node one block and returns the mined block with the receipts of the transactions.

The block must include all given transactions, in any order, and no other transaction of the pool, so a transaction that is dropped or that rides along fails instead of going unnoticed. An empty txs mines a block without pool transactions. Transactions that the payload builder adds by itself, e.g. from the payload attributes, are not pool transactions and may be included. Use Self::mine_including if other pool transactions may be included too.

The receipts are in the order of txs and can report reverted transactions, see MinedBlock::ensure_success. The committed chain segment is taken from Self::canonical_stream, whose notifications up to the one of the mined block are consumed, so the stream does not need to be aligned with the mined blocks before.

The block is imported with Self::import_payload, so the transaction pool processes it in the background, see Self::advance_block_synced.

Returns an error if the pool rejects a transaction, or, without importing the block, if the block does not include the expected transactions, listing the missing and the unexpected ones.

Use Self::mine_pooled for transactions that are already in the pool, e.g. sent through Self::rpc_provider_with_wallet or added with the pool API, and Self::mine_signed for signed transactions that should all succeed.

The helpers that drive the eth API return boxed futures: with the new trait solver, awaiting the unboxed future makes every caller borrow-check its whole state machine, which dominates compile time for nodes with large eth API impls.

Source

pub fn mine_including( &mut self, txs: impl IntoIterator<Item = Bytes>, ) -> MinedBlockFuture<'_, Payload::BuiltPayload, RpcReceipt<<AddOns::EthApi as EthApiTypes>::NetworkTypes>>
where Payload::BuiltPayload: BuiltPayload<Primitives = PrimitivesTy<Node::Types>>, AddOns::EthApi: EthApiSpec<Provider: BlockReader<Block = BlockTy<Node::Types>>> + EthTransactions + TraceExt + LoadReceipt + 'static,

Mines the raw transactions like Self::mine, but the block may also include other transactions of the pool, e.g. transactions that peers gossiped to the node.

Only the receipts of the given transactions are returned.

Source

pub fn mine_signed<T: Encodable2718>( &mut self, txs: impl IntoIterator<Item = T>, ) -> MinedBlockFuture<'_, Payload::BuiltPayload, RpcReceipt<<AddOns::EthApi as EthApiTypes>::NetworkTypes>>
where Payload::BuiltPayload: BuiltPayload<Primitives = PrimitivesTy<Node::Types>>, AddOns::EthApi: EthApiSpec<Provider: BlockReader<Block = BlockTy<Node::Types>>> + EthTransactions + TraceExt + LoadReceipt + 'static,

Mines the signed transactions like Self::mine and returns an error if one of them reverted, see MinedBlock::ensure_success.

The transactions are EIP-2718 encoded before they are sent to the pool, so signed transactions or envelopes, e.g. of a custom transaction type, can be passed without encoding them first.

Source

pub fn mine_pooled( &mut self, hashes: impl IntoIterator<Item = B256>, ) -> MinedBlockFuture<'_, Payload::BuiltPayload, RpcReceipt<<AddOns::EthApi as EthApiTypes>::NetworkTypes>>
where Payload::BuiltPayload: BuiltPayload<Primitives = PrimitivesTy<Node::Types>>, AddOns::EthApi: EthApiSpec<Provider: BlockReader<Block = BlockTy<Node::Types>>> + EthTransactions + TraceExt + LoadReceipt + 'static,

Mines the transactions with the given hashes like Self::mine, for transactions that are already in the pool, e.g. sent through Self::rpc_provider_with_wallet or added with the pool API.

The receipts are in the order of hashes.

Before building a block, returns an error naming the first hash that is not in the pool, e.g. of a transaction that was already mined or replaced. Transactions in any sub-pool pass this check, not only pending ones, since the pool sorts transactions for its own view of the next block, which can lag behind the block that is built. A transaction the block can not include, e.g. one queued behind a nonce gap, is reported as missing like with Self::mine.

Source

pub async fn wait_block( &self, number: BlockNumber, expected_block_hash: BlockHash, wait_finish_checkpoint: bool, ) -> Result<()>

Waits for block to be available on node.

Returns an error if the block is not available within WAIT_TIMEOUT.

Source

pub async fn wait_unwind(&self, number: BlockNumber) -> Result<()>

Waits for the node to unwind to the given block number.

Returns an error if the node does not unwind within WAIT_TIMEOUT.

Source

pub async fn wait_for_pool( &self, condition: impl FnMut(&Node::Pool) -> bool, ) -> Result<()>

Waits until condition holds for the transaction pool of the node.

Returns an error if the condition does not hold within WAIT_TIMEOUT.

Source

pub async fn wait_for_pool_head(&self, hash: B256) -> Result<()>

Waits until the transaction pool of the node processed the canonical state update that made the block with the given hash its head.

The pool maintenance task processes new heads in the background, so right after e.g. a forkchoice update the pool can still contain the transactions mined in the new block or use outdated sender nonces and pending fees. The pool updates its last seen block together with these, so they are up to date once this returns. Exceptions are reorgs, after which the maintenance task re-injects the transactions of the old chain only afterwards, so wait for them with Self::wait_for_pooled, and commits deeper than the maximum update depth of the maintenance task, e.g. after a long sync, which only update the last seen block.

This only covers the canonical state update of the pool itself. Nodes can run additional pool maintenance tasks on new blocks, e.g. to remove mined transactions from a separate sub-pool or to evict transactions by their own rules, and the pool can report the new head before these processed the block. Tests of such nodes have to wait for the expected contents of the pool instead, with Self::wait_for_pool_removal, Self::wait_for_pooled or Self::wait_for_pool.

Returns an error if the pool does not process the block within WAIT_TIMEOUT, e.g. because the block is not the canonical head, the pool already processed a newer head, or the block was synced by backfill, which does not notify the pool.

Source

pub async fn wait_for_pooled( &self, hashes: impl IntoIterator<Item = B256>, ) -> Result<()>

Waits until all transactions with the given hashes are in the transaction pool of the node.

The transactions must be in the pool at the same time, so this keeps waiting if one of them leaves the pool again, e.g. because it is mined or replaced, before the others entered.

Returns an error listing the transactions that are still missing if they are not all in the pool within WAIT_TIMEOUT.

Source

pub async fn wait_for_pool_removal( &self, hashes: impl IntoIterator<Item = B256>, ) -> Result<()>

Waits until none of the transactions with the given hashes is in the transaction pool of the node, regardless of why they left, e.g. because they were mined, replaced or evicted.

Unlike Self::wait_for_pool_head, this does not depend on which task removes the transactions, so it also covers nodes with additional pool maintenance tasks. It returns right away for transactions that never entered the pool, so wait for transactions that arrive in the background, e.g. from peers, with Self::wait_for_pooled first.

Returns an error listing the transactions that are still pooled if they do not all leave the pool within WAIT_TIMEOUT.

Source

pub async fn wait_for_persisted_block(&self, number: BlockNumber) -> Result<()>

Waits until the node has persisted at least the block with the given number to disk.

The engine keeps the most recent blocks in memory, so tests that inspect the database directly, e.g. via assert_trie_consistency, must first advance the chain far enough and wait for the persistence service to catch up. This checks the Finish stage checkpoint of the database, which is committed together with the saved blocks, so all blocks up to number are readable from disk once this returns. Their state and trie are committed in the same transaction, unless the engine keeps the state of the most recently persisted blocks masked by its in-memory suffix (TreeConfig::num_state_masking_blocks, disabled by a persistence threshold of 0), in which case the persisted state can lag behind number. The pruner runs after the save in a separate commit, so pruning of the saved blocks can still be pending, wait for it with Self::wait_for_prune_checkpoint.

Unlike Self::wait_block, this does not check the block hash, so it also returns if the persisted block at number is not canonical anymore.

Returns an error if the block is not persisted within WAIT_TIMEOUT.

Source

pub async fn wait_for_prune_checkpoint( &self, segment: PruneSegment, block: BlockNumber, ) -> Result<()>

Waits until the pruner has pruned segment of the node up to at least the block with the given number.

The persistence service acknowledges a save before it runs the pruner for the new database tip in a separate commit, so a block being persisted, e.g. awaited with Self::wait_for_persisted_block, does not mean the pruner has run for it yet. The pruner saves the checkpoint of a segment in the same provider commit as the pruned data, which commits static files and RocksDB before the database transaction, so the data of segment up to block is pruned once this returns.

Returns an error if the segment is not pruned within WAIT_TIMEOUT, e.g. because the node is not configured to prune it or block is within its retention window.

Source

pub async fn wait_for_head(&self, hash: BlockHash) -> Result<()>

Waits until the block with the given hash is the latest block of the node, i.e. its canonical head.

This only observes the node and sends nothing to the engine, so the block has to become the head otherwise, e.g. through a forkchoice update the test sent itself, which may start a backfill sync to the block. Self::sync_to instead keeps sending forkchoice updates that make the block the head, safe and finalized block until it is the head, and then waits briefly for the transaction pool, which this does not, see Self::wait_for_pool_head. Self::wait_block waits for the header at a block number, which a canonical block that is not the head also satisfies, and after a backfill sync it can return before the engine made the synced block its head, even when it waits for the Finish checkpoint of the pipeline.

Returns an error naming the head of the node if the block is not the head within WAIT_TIMEOUT, e.g. because the node made another block its head.

Source

pub async fn assert_new_block( &mut self, tip_tx_hash: B256, block_hash: B256, block_number: BlockNumber, ) -> Result<()>

Asserts that a new block has been added to the blockchain and the tx has been included in the block, at any position.

Does NOT work for pipeline since there’s no stream notification! Returns an error if the block is not committed within WAIT_TIMEOUT.

Source

pub fn block_hash(&self, number: u64) -> BlockHash

Gets block hash by number.

Source

pub fn snap_attempt(&self) -> Result<SnapAttempt>

Returns the snap attempt the node persisted.

Source

pub async fn sync_to(&self, block: BlockHash) -> Result<()>

Sends FCU and waits for the node to sync to the given block.

The forkchoice update makes the block the head, safe and finalized block, regardless of the Finality policy of the context. Returns an error if the node does not sync within WAIT_TIMEOUT.

Source

pub async fn sync_to_forkchoice(&self, state: ForkchoiceState) -> Result<()>

Sends the forkchoice update state and waits for the node to sync to its head, like Self::sync_to, but with the safe and finalized blocks of state.

A finalized block below the head, e.g. one the node does not know yet, lets a backfill anchor to it, as a snap sync anchors its pivot to the finalized block. Returns an error if the node does not sync within WAIT_TIMEOUT.

Source

pub async fn update_forkchoice( &self, current_head: B256, new_head: B256, ) -> Result<ForkchoiceUpdated>

Sends a forkchoice update message to the engine and returns its response.

The update makes new_head the head and current_head the safe and finalized block, regardless of the Finality policy of the context.

Source

pub async fn update_optimistic_forkchoice( &self, hash: B256, ) -> Result<ForkchoiceUpdated>

Sends forkchoice update to the engine api with a zero finalized hash and returns its response.

Source

pub async fn submit_payload( &self, payload: Payload::BuiltPayload, ) -> Result<B256>

Submits a payload to the engine with newPayload and returns its block hash.

This only inserts the block, it does not make it canonical, see Self::import_payload. Returns the block hash if the engine reports the payload:

  • VALID: the engine executed the block on top of its parent, or knew it as valid already.
  • SYNCING or ACCEPTED: the engine did not execute the block, e.g. because its parent is unknown, so the block is not known to be valid yet, see Self::submit_payload_with_status.

Returns an error with the validation error and the latest valid hash if the engine reports the payload INVALID. Use Self::submit_payload_with_status to inspect the status instead, e.g. to test that a payload is rejected.

Source

pub async fn submit_payload_with_status( &self, payload: Payload::BuiltPayload, ) -> Result<PayloadStatus>

Submits a payload to the engine with newPayload and returns the payload status the engine reports.

Unlike Self::submit_payload, this returns INVALID statuses instead of an error. This only inserts the block, it does not make it canonical. The engine reports:

  • VALID if it executed the block on top of its parent, or knew it as valid already. The latest valid hash is the block hash.
  • INVALID if the block failed validation, or descends from a block that did. The latest valid hash is the hash of the most recent valid ancestor, or None if the engine can’t determine it, e.g. because the block hash does not match the payload.
  • SYNCING if it did not execute the block because the parent of the block is unknown, in which case it buffers the block and executes it once the parent is inserted, or because the node is syncing.
  • ACCEPTED if it accepted the block without executing it. The reth engine tree does not report this status.

Returns an error if the engine fails to process the payload, e.g. because it shut down.

Source

pub const fn set_finality(&mut self, finality: Finality)

Sets which blocks Self::import_payload and the block producing helpers built on it, such as Self::advance_block, mark as safe and finalized, see Finality.

The policy applies from the next imported block on, the current safe and finalized blocks are not changed. Defaults to Finality::Head.

Source

pub async fn import_payload( &self, payload: Payload::BuiltPayload, ) -> Result<B256>

Submits a payload to the engine and makes its block the canonical head, returning the block hash.

The forkchoice update marks the safe and finalized blocks according to the Finality policy of the context, see Self::set_finality. Under the default Finality::Head, the block also becomes the safe and finalized block, so only a forkchoice update that moves the finalized block to another chain can reorg it. The engine only reports the forkchoice update valid after making the head canonical, so the block is the latest block of the node once this returns. The transaction pool processes the new block in the background, see Self::wait_for_pool.

The parent of the payload must be known to the node, e.g. to import a payload built by another node into its peers. Returns an error if the engine reports the payload invalid, see Self::submit_payload, or does not report the forkchoice update valid, e.g. because the parent is unknown, or because the block does not descend from the safe and finalized blocks that Finality::Keep and Finality::Lag keep.

Source

pub async fn reorg_to(&self, hash: B256) -> Result<()>

Makes the known block with the given hash the head of the node, keeping its safe and finalized blocks, and returns once the block is the latest block.

The engine makes a block on a side chain canonical, which reorgs the chain, e.g. back to a chain the node left with Self::advance_fork. This requires the block to descend from the finalized block, so blocks imported under Finality::Head can’t be reorged away from, import them under Finality::Keep or Finality::Lag, see Self::set_finality. The engine does not move the head back to a canonical ancestor, so this returns an error for those, build a block on the ancestor with Self::advance_block_on instead.

The transaction pool processes the reorg in the background: once Self::wait_for_pool_head returns for the block, the pool has removed the transactions mined in the new chain and updated sender nonces and fees to it, while the maintenance task re-injects the transactions of the reorged blocks only afterwards, wait for them with Self::wait_for_pool.

Returns an error if the node does not know the block or one of its ancestors, if the block is invalid, or if it does not descend from the safe and finalized blocks.

Source

pub fn rpc_url(&self) -> Url

Returns the RPC URL.

Source

pub fn rpc_client(&self) -> Option<HttpClient>

Returns an RPC client.

Source

pub fn rpc_provider( &self, ) -> FillProvider<impl TxFiller<Ethereum> + use<Node, Payload, AddOns>, RootProvider>

Returns an alloy provider with the recommended fillers connected to the HTTP RPC server.

§Panics

If the HTTP RPC server is disabled.

Source

pub fn rpc_provider_with_wallet<W>( &self, wallet: W, ) -> FillProvider<impl TxFiller<Ethereum> + use<W, Node, Payload, AddOns>, RootProvider>
where W: IntoWallet<Ethereum, NetworkWallet: Clone>,

Returns an alloy provider with the recommended fillers and the given wallet connected to the HTTP RPC server.

Transactions sent via the provider are signed by the wallet, e.g. a PrivateKeySigner of the test Wallet.

§Panics

If the HTTP RPC server is disabled.

Source

pub fn rpc_provider_for<Net: RecommendedFillers>( &self, ) -> FillProvider<impl TxFiller<Net> + use<Net, Node, Payload, AddOns>, RootProvider<Net>, Net>

Returns an alloy provider for the network Net with its recommended fillers connected to the HTTP RPC server, polling every RPC_PROVIDER_POLL_INTERVAL.

This is Self::rpc_provider for nodes whose RPC types differ from Ethereum’s.

§Panics

If the HTTP RPC server is disabled.

Source

pub fn rpc_provider_with_wallet_for<Net, W>( &self, wallet: W, ) -> FillProvider<impl TxFiller<Net> + use<Net, W, Node, Payload, AddOns>, RootProvider<Net>, Net>
where Net: RecommendedFillers, W: IntoWallet<Net, NetworkWallet: Clone>,

Returns an alloy provider for the network Net with its recommended fillers and the given wallet connected to the HTTP RPC server, polling every RPC_PROVIDER_POLL_INTERVAL.

This is Self::rpc_provider_with_wallet for nodes whose RPC types differ from Ethereum’s.

§Panics

If the HTTP RPC server is disabled.

Source

pub fn auth_server_handle(&self) -> AuthServerHandle

Returns an Engine API client.

Source

pub fn to_node_client(&self) -> Result<NodeClient<Payload>>

Creates a crate::testsuite::NodeClient from this test context.

This helper method extracts the necessary handles and creates a client that can interact with both the regular RPC and Engine API endpoints. It automatically includes the beacon engine handle for direct consensus engine interaction and read-only access to the node’s database.

Source

pub async fn testing_build_block_v1( &self, request: TestingBuildBlockRequestV1, ) -> Result<TestingBuildBlockResponseV1>

Calls the testing_buildBlockV1 RPC on this node.

This endpoint builds a block using the provided parent, payload attributes, and transactions. Requires the Testing RPC module to be enabled.

Source

pub async fn stop(self) -> Result<StoppedNode<Node, AddOns>>

Stops the node and closes its database, keeping its datadir to launch the node again with StoppedNode::start.

The node shuts down like a node that receives SIGTERM: the engine persists every block of its canonical chain together with its state, and the tasks of the node exit. Blocks that are not canonical, e.g. payloads that were only submitted with Self::submit_payload, are lost. Local transactions of the pool are saved to the datadir and reinserted when the node starts again.

Returns once the node released its database, so the database, static files and RocksDB are closed and nothing writes to the datadir anymore, including the pruner that runs after the last save. Peers of the node notice the disconnect in the background.

Only restartable nodes, see E2ETestSetupBuilder::with_restartable_nodes, can be stopped. Returns an error for other nodes, if the node does not shut down within WAIT_TIMEOUT, or if the test keeps the database open:

  • a handle of the node that holds its database, e.g. a clone of inner.provider or a NodeClient, makes this fail once the database is still in use DATABASE_RELEASE_TIMEOUT after the node shut down,
  • an open database transaction, e.g. a provider of database_provider_ro, makes this fail right away,
  • a handle of RocksDB, e.g. of inner.provider.rocksdb_provider(), makes this fail once RocksDB is still open DATABASE_RELEASE_TIMEOUT after the node shut down.

Drop such handles before stopping the node.

Source

pub async fn stop_with_release_timeout( self, release_timeout: Duration, ) -> Result<StoppedNode<Node, AddOns>>

Stops the node like Self::stop, but waits at most release_timeout instead of DATABASE_RELEASE_TIMEOUT for the database and RocksDB to be released.

Source

pub async fn restart(self) -> Result<Self>

Stops the node with Self::stop and starts it again with StoppedNode::start, returning its new test context.

Source

pub fn take_exit_future(&mut self) -> Option<NodeExitFuture>

Takes the future that resolves when the consensus engine of the node exits.

It resolves with an error if the engine exits because of a fatal error, and with Ok once the node is stopped, so a test can use it to notice a node that died. Returns None if the future was already taken or the node was not launched by E2ETestSetupBuilder.

Auto Trait Implementations§

§

impl<Node, AddOns> !Freeze for NodeTestContext<Node, AddOns>

§

impl<Node, AddOns> !RefUnwindSafe for NodeTestContext<Node, AddOns>

§

impl<Node, AddOns> !UnwindSafe for NodeTestContext<Node, AddOns>

§

impl<Node, AddOns> Send for NodeTestContext<Node, AddOns>
where FullNode<Node, AddOns>: Send, PayloadTestContext<<<Node as FullNodeTypes>::Types as NodeTypes>::Payload>: Send, NetworkTestContext<<Node as FullNodeComponents>::Network>: Send, RpcTestContext<Node, <AddOns as RethRpcAddOns<Node>>::EthApi>: Send, EngineTestContext<<<Node as FullNodeTypes>::Types as NodeTypes>::Payload>: Send, CanonStateNotificationStream<<<Node as FullNodeTypes>::Types as NodeTypes>::Primitives>: Send, Option<NodeRestart<NodeTestContext<Node, AddOns>>>: Send,

§

impl<Node, AddOns> Sync for NodeTestContext<Node, AddOns>
where FullNode<Node, AddOns>: Sync, PayloadTestContext<<<Node as FullNodeTypes>::Types as NodeTypes>::Payload>: Sync, NetworkTestContext<<Node as FullNodeComponents>::Network>: Sync, RpcTestContext<Node, <AddOns as RethRpcAddOns<Node>>::EthApi>: Sync, EngineTestContext<<<Node as FullNodeTypes>::Types as NodeTypes>::Payload>: Sync, CanonStateNotificationStream<<<Node as FullNodeTypes>::Types as NodeTypes>::Primitives>: Sync, Option<NodeRestart<NodeTestContext<Node, AddOns>>>: Sync,

§

impl<Node, AddOns> Unpin for NodeTestContext<Node, AddOns>
where FullNode<Node, AddOns>: Unpin, PayloadTestContext<<<Node as FullNodeTypes>::Types as NodeTypes>::Payload>: Unpin, NetworkTestContext<<Node as FullNodeComponents>::Network>: Unpin, RpcTestContext<Node, <AddOns as RethRpcAddOns<Node>>::EthApi>: Unpin, EngineTestContext<<<Node as FullNodeTypes>::Types as NodeTypes>::Payload>: Unpin, CanonStateNotificationStream<<<Node as FullNodeTypes>::Types as NodeTypes>::Primitives>: Unpin, Option<NodeRestart<NodeTestContext<Node, AddOns>>>: Unpin,

§

impl<Node, AddOns> UnsafeUnpin for NodeTestContext<Node, AddOns>
where FullNode<Node, AddOns>: UnsafeUnpin, PayloadTestContext<<<Node as FullNodeTypes>::Types as NodeTypes>::Payload>: UnsafeUnpin, NetworkTestContext<<Node as FullNodeComponents>::Network>: UnsafeUnpin, RpcTestContext<Node, <AddOns as RethRpcAddOns<Node>>::EthApi>: UnsafeUnpin, EngineTestContext<<<Node as FullNodeTypes>::Types as NodeTypes>::Payload>: UnsafeUnpin, CanonStateNotificationStream<<<Node as FullNodeTypes>::Types as NodeTypes>::Primitives>: UnsafeUnpin, Option<NodeRestart<NodeTestContext<Node, AddOns>>>: UnsafeUnpin,

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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Conv for T

§

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

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

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

§

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<TxEnv, T> FromRecoveredTx<&T> for TxEnv
where TxEnv: FromRecoveredTx<T>,

§

fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv

Builds a [TxEnv] from a transaction and a sender address.
§

impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnv
where TxEnv: FromTxWithEncoded<T>,

§

fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv

Builds a [TxEnv] from a transaction, its sender, and encoded transaction bytes.
§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self> ⓘ

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

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> Instrument for T

Source§

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

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

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> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> MaybeSend for T
where T: Send,

§

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
§

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> ServiceExt for T

§

fn propagate_header(self, header: HeaderName) -> PropagateHeader<Self>
where Self: Sized,

Propagate a header from the request to the response. Read more
§

fn add_extension<T>(self, value: T) -> AddExtension<Self, T>
where Self: Sized,

Add some shareable value to request extensions. Read more
§

fn map_request_body<F>(self, f: F) -> MapRequestBody<Self, F>
where Self: Sized,

Apply a transformation to the request body. Read more
§

fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>
where Self: Sized,

Apply a transformation to the response body. Read more
§

fn compression(self) -> Compression<Self>
where Self: Sized,

Compresses response bodies. Read more
§

fn decompression(self) -> Decompression<Self>
where Self: Sized,

Decompress response bodies. Read more
§

fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using HTTP status codes. Read more
§

fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using gRPC headers. Read more
§

fn follow_redirects(self) -> FollowRedirect<Self>
where Self: Sized,

Follow redirect resposes using the Standard policy. Read more
§

fn sensitive_headers( self, headers: impl IntoIterator<Item = HeaderName>, ) -> SetSensitiveRequestHeaders<SetSensitiveResponseHeaders<Self>>
where Self: Sized,

Mark headers as sensitive on both requests and responses. Read more
§

fn sensitive_request_headers( self, headers: impl IntoIterator<Item = HeaderName>, ) -> SetSensitiveRequestHeaders<Self>
where Self: Sized,

Mark headers as sensitive on requests. Read more
§

fn sensitive_response_headers( self, headers: impl IntoIterator<Item = HeaderName>, ) -> SetSensitiveResponseHeaders<Self>
where Self: Sized,

Mark headers as sensitive on responses. Read more
§

fn override_request_header<M>( self, header_name: HeaderName, make: M, ) -> SetRequestHeader<Self, M>
where Self: Sized,

Insert a header into the request. Read more
§

fn append_request_header<M>( self, header_name: HeaderName, make: M, ) -> SetRequestHeader<Self, M>
where Self: Sized,

Append a header into the request. Read more
§

fn insert_request_header_if_not_present<M>( self, header_name: HeaderName, make: M, ) -> SetRequestHeader<Self, M>
where Self: Sized,

Insert a header into the request, if the header is not already present. Read more
§

fn override_response_header<M>( self, header_name: HeaderName, make: M, ) -> SetResponseHeader<Self, M>
where Self: Sized,

Insert a header into the response. Read more
§

fn append_response_header<M>( self, header_name: HeaderName, make: M, ) -> SetResponseHeader<Self, M>
where Self: Sized,

Append a header into the response. Read more
§

fn insert_response_header_if_not_present<M>( self, header_name: HeaderName, make: M, ) -> SetResponseHeader<Self, M>
where Self: Sized,

Insert a header into the response, if the header is not already present. Read more
§

fn set_request_id<M>( self, header_name: HeaderName, make_request_id: M, ) -> SetRequestId<Self, M>
where Self: Sized, M: MakeRequestId,

Add request id header and extension. Read more
§

fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>
where Self: Sized, M: MakeRequestId,

Add request id header and extension, using x-request-id as the header name. Read more
§

fn propagate_request_id( self, header_name: HeaderName, ) -> PropagateRequestId<Self>
where Self: Sized,

Propgate request ids from requests to responses. Read more
§

fn propagate_x_request_id(self) -> PropagateRequestId<Self>
where Self: Sized,

Propgate request ids from requests to responses, using x-request-id as the header name. Read more
§

fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>
where Self: Sized,

Catch panics and convert them into 500 Internal Server responses. Read more
§

fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>
where Self: Sized,

Intercept requests with over-sized payloads and convert them into 413 Payload Too Large responses. Read more
§

fn trim_trailing_slash(self) -> NormalizePath<Self>
where Self: Sized,

Remove trailing slashes from paths. Read more
§

fn append_trailing_slash(self) -> NormalizePath<Self>
where Self: Sized,

Append trailing slash to paths. Read more
§

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

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 = !

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

fn try_from(value: U) -> Result<T, !>

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

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

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

Layout§

Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.