Struct ExplorerService

Source
pub struct ExplorerService {
    pub db: ExplorerDb,
    pub darkfid_client: Arc<DarkfidRpcClient>,
}
Expand description

Represents the service layer for the Explorer application, bridging the RPC layer and the database. It encapsulates explorer business logic and provides a unified interface for core functionalities, providing a clear separation of concerns between RPC handling and data management layers.

Core functionalities include:

  • Data Transformation: Converting database data into structured responses suitable for RPC callers.
  • Blocks: Synchronization, retrieval, counting, and management.
  • Contracts: Handling native and user contract data, source code, tar files, and metadata.
  • Metrics: Providing metric-related data over the life of the chain.
  • Transactions: Synchronization, calculating gas data, retrieval, counting, and related block information.

Fields§

§db: ExplorerDb

Explorer database instance

§darkfid_client: Arc<DarkfidRpcClient>

JSON-RPC client used to execute requests to Darkfi blockchain nodes

Implementations§

Source§

impl ExplorerService

Source

pub fn reset_blocks(&self) -> Result<()>

Resets blocks in the database by clearing all block related trees, returning an Ok result on success.

Source

pub async fn put_block(&self, block: &BlockInfo) -> Result<()>

Adds the provided [BlockInfo] to the block explorer database.

This function processes each transaction in the block, calculating and updating the latest [GasMetrics] for non-genesis blocks and for transactions that are not PoW rewards. After processing all transactions, the block is permanently persisted to the explorer database.

Source

pub fn get_block_count(&self) -> usize

Provides the total block count.

Source

pub fn get_blocks(&self) -> Result<Vec<BlockRecord>>

Fetch all known blocks from the database.

Source

pub fn get_block_by_hash( &self, header_hash: &str, ) -> Result<Option<BlockRecord>>

Fetch a block given its header hash from the database.

Source

pub fn get_block_by_height(&self, height: u32) -> Result<Option<BlockRecord>>

Fetch a block given its height from the database.

Source

pub fn last_block(&self) -> Result<Option<(u32, String)>>

Fetch the last block from the database.

Source

pub fn get_last_n(&self, n: usize) -> Result<Vec<BlockRecord>>

Fetch the last N blocks from the database.

Source

pub fn get_by_range(&self, start: u32, end: u32) -> Result<Vec<BlockRecord>>

Fetch blocks within a specified range from the database.

Source

pub fn reset_to_height(&self, reset_height: u32) -> Result<()>

Resets the [ExplorerDb::blockchain::blocks] and [ExplorerDb::blockchain::transactions] trees to a specified height by removing entries above the reset_height, returning a result that indicates success or failure.

The function retrieves the last explorer block and iteratively rolls back entries in the [BlockStore::main], [BlockStore::order], and [BlockStore::difficulty] trees to the specified reset_height. It also resets the [TxStore::main] and [TxStore::location] trees to reflect the transaction state at the given height.

This operation is performed atomically using a sled transaction applied across the affected sled trees, ensuring consistency and avoiding partial updates.

Source§

impl ExplorerService

Source

pub fn get_contract_count(&self) -> usize

Fetches the total contract count of all deployed contracts in the explorer database.

Source

pub fn get_contracts(&self) -> Result<Vec<ContractRecord>>

Retrieves all contracts from the store excluding native contracts (DAO, Deployooor, and Money), transforming them into Vec of ContractRecords, and returns the result.

Source

pub fn get_native_contracts(&self) -> Result<Vec<ContractRecord>>

Retrieves all native contracts (DAO, Deployooor, and Money) from the store, transforming them into Vec of ContractRecords and returns the result.

Source

pub fn get_contract_source_paths( &self, contract_id: &ContractId, ) -> Result<Vec<String>>

Fetches a list of source code file paths for a given [ContractId], returning an empty vector if no contracts are found.

Source

pub fn get_contract_metadata( &self, contract_id: &ContractId, ) -> Result<Option<ContractMetaData>>

Fetches ContractMetaData for a given [ContractId], returning None if no metadata is found.

Source

pub fn get_contract_source_content( &self, contract_id: &ContractId, path: &str, ) -> Result<Option<String>>

Fetches the source code content for a specified [ContractId] and path, returning None if no source content is found.

Source

pub fn add_contract_source( &self, contract_id: &ContractId, tar_bytes: &[u8], ) -> Result<()>

Adds source code for a specified [ContractId] from a provided tar file (in bytes).

This function extracts the tar archive from tar_bytes, then loads each source file into the store. Each file is keyed by its path prefixed with the Contract ID. Returns a successful result or an error.

Source

pub fn add_contract_metadata( &self, contract_ids: &[ContractId], metadata: &[ContractMetaData], ) -> Result<()>

Adds provided [ContractId] with corresponding ContractMetaData pairs into the contract metadata store, returning a successful result upon success.

Source

pub async fn deploy_native_contracts(&self) -> Result<()>

Deploys native contracts required for gas calculation and retrieval.

Source

pub fn load_native_contract_sources(&self) -> Result<()>

Loads native contract source code into the explorer database by extracting it from tar archives created during the explorer build process. The extracted source code is associated with the corresponding [ContractId] for each loaded contract and stored.

Source

pub fn load_native_contract_metadata(&self) -> Result<()>

Loads ContractMetaData for deployed native contracts into the explorer database by adding descriptive information (e.g., name and description) used to display contract details.

Source

fn to_contract_record(&self, contract_id: &ContractId) -> Result<ContractRecord>

Converts a [ContractId] into a ContractRecord.

This function retrieves the ContractMetaData associated with the provided Contract ID and uses any found metadata to construct a contract record. Upon success, the function returns a ContractRecord containing relevant details about the contract.

Source

fn get_filtered_contracts<F>(&self, filter_fn: F) -> Result<Vec<ContractRecord>>
where F: Fn(&ContractId) -> bool,

Auxiliary function that retrieves ContractRecords filtered by a provided filter_fn closure.

This function accepts a filter function Fn(&ContractId) -> bool that determines which contracts are included based on their [ContractId]. It iterates over Contract IDs stored in the blockchain’s contract tree, applying the filter function to decide inclusion. Converts the filtered Contract IDs into ContractRecord instances, returning them as a Vec, or an empty Vec if no contracts are found.

Source§

impl ExplorerService

Source

pub fn get_base_statistics(&self) -> Result<Option<BaseStatistics>>

Fetches the latest BaseStatistics from the explorer database, or returns None if no block exists.

Source

pub async fn get_metrics_statistics(&self) -> Result<Vec<MetricStatistics>>

Fetches the latest metrics from the explorer database, returning a vector of MetricStatistics if found, or an empty Vec if no metrics exist.

Source

pub async fn get_latest_metrics_statistics(&self) -> Result<MetricStatistics>

Fetches the latest metrics from the explorer database, returning MetricStatistics if found, or zero-initialized defaults when not.

Source§

impl ExplorerService

Source

pub fn reset_transactions(&self) -> Result<()>

Resets transactions in the database by clearing transaction-related trees, returning an Ok result on success.

Source

pub fn get_transaction_count(&self) -> usize

Provides the transaction count of all the transactions in the explorer database.

Source

pub fn get_transactions(&self) -> Result<Vec<TransactionRecord>>

Fetches all known transactions from the database.

This function retrieves all transactions stored in the database and transforms them into a vector of TransactionRecords. If no transactions are found, it returns an empty vector.

Source

pub fn get_transactions_by_header_hash( &self, header_hash: &str, ) -> Result<Vec<TransactionRecord>>

Fetches all transactions from the database for the given block header_hash.

This function retrieves all transactions associated with the specified block header hash. It first parses the header hash and then fetches the corresponding [BlockInfo]. If the block is found, it transforms its transactions into a vector of TransactionRecords. If no transactions are found, it returns an empty vector.

Source

pub fn get_transaction_by_hash( &self, tx_hash: &TransactionHash, ) -> Result<Option<TransactionRecord>>

Fetches a transaction given its header hash.

This function retrieves the transaction associated with the provided [TransactionHash] and transforms it into a TransactionRecord if found. If no transaction is found, it returns None.

Source

fn get_tx_block_info( &self, tx_hash: &TransactionHash, ) -> Result<Option<BlockInfo>>

Fetches the [BlockInfo] associated with a given transaction hash.

This auxiliary function first fetches the location of the transaction in the blockchain. If the location is found, it retrieves the associated [HeaderHash] and then fetches the block information corresponding to that header hash. The function returns the [BlockInfo] if successful, or None if no location or header hash is found.

Source

fn get_block_info(&self, header_hash: HeaderHash) -> Result<Option<BlockInfo>>

Fetches the [BlockInfo] associated with a given [HeaderHash].

This auxiliary function attempts to retrieve the block information using the specified [HeaderHash]. It returns the associated [BlockInfo] if found, or None when not found.

Source

pub async fn calculate_tx_gas_data( &self, tx: &Transaction, verify_fee: bool, ) -> Result<GasData>

Calculates the gas data for a given transaction, returning a [GasData] instance detailing various aspects of the gas usage.

Source

fn to_tx_record( &self, block_info_opt: Option<BlockInfo>, tx: &Transaction, ) -> Result<TransactionRecord>

Converts a [Transaction] and its associated block information into a TransactionRecord.

This auxiliary function first retrieves the gas data associated with the provided transaction. If [BlockInfo] is not provided, it attempts to fetch it using the transaction’s hash, returning an error if the block information cannot be found. Upon success, the function returns a TransactionRecord containing relevant details about the transaction.

Source§

impl ExplorerService

Source

pub async fn sync_blocks(&self, reset: bool) -> Result<()>

Synchronizes blocks between the explorer and a Darkfi blockchain node, ensuring the database remains consistent by syncing any missing or outdated blocks.

If provided reset is true, the explorer’s blockchain-related and metric sled trees are purged and syncing starts from the genesis block. The function also handles reorgs by re-aligning the explorer state to the correct height when blocks are outdated. Returns a result indicating success or failure.

Reorg handling is delegated to the Self::reorg_blocks function, whose documentation provides more details on the reorg process during block syncing.

Source

async fn reorg_blocks( &self, last_synced_height: u32, last_darkfid_height: u32, ) -> Result<u32>

Handles blockchain reorganizations (reorgs) during the explorer node’s startup synchronization with Darkfi nodes, ensuring the explorer provides a consistent and accurate view of the blockchain.

A reorg occurs when the blocks stored by the blockchain nodes diverge from those stored by the explorer. This function resolves inconsistencies by identifying the point of divergence, searching backward through block heights, and comparing block hashes between the explorer database and the blockchain node. Once a common block height is found, the explorer is re-aligned to that height.

If no common block can be found, the explorer resets to the “genesis height,” removing all blocks, transactions, and metrics from its database to resynchronize with the canonical chain from the nodes.

Returns the last height at which the explorer’s state was successfully re-aligned with the blockchain.

Source§

impl ExplorerService

Source

pub fn new( db_path: String, darkfid_client: Arc<DarkfidRpcClient>, ) -> Result<Self>

Creates a new ExplorerService instance.

Source

pub async fn init(&self) -> Result<()>

Initializes the explorer service by deploying native contracts and loading native contract source code and metadata required for its operation.

Source

pub fn reset_explorer_state(&self, height: u32) -> Result<()>

Resets the explorer state to the specified height. If a genesis block height is provided, all blocks and transactions are purged from the database. Otherwise, the state is reverted to the given height. The explorer metrics are updated to reflect the updated blocks and transactions up to the reset height, ensuring consistency. Returns a result indicating success or an error if the operation fails.

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
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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

§

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

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

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSend for T
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

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

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
§

impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
where T: SharedNiching<N1, N2>, N1: Niching<T>, N2: Niching<T>,

§

unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool

Returns whether the given value has been niched. Read more
§

fn resolve_niched(out: Place<NichedOption<T, N1>>)

Writes data to out indicating that a T is niched.
§

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

§

type Metadata = ()

The metadata type for pointers and references to this type.
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.
§

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<T> Upcastable for T
where T: Any + Send + Sync + 'static,

§

fn upcast_any_ref(&self) -> &(dyn Any + 'static)

upcast ref
§

fn upcast_any_mut(&mut self) -> &mut (dyn Any + 'static)

upcast mut ref
§

fn upcast_any_box(self: Box<T>) -> Box<dyn Any>

upcast boxed dyn
§

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