pub(crate) struct Actor<TContext, TPeerManager>where
TContext: Clock + Metrics + Storage,
TPeerManager: Manager,{
config: Config<TPeerManager>,
context: ContextCell<TContext>,
mailbox: UnboundedReceiver<Message>,
ceremony_metadata: Arc<Mutex<Metadata<ContextCell<TContext>, U64, State>>>,
post_allegretto_metadatas: Metadatas<ContextCell<TContext>>,
pre_allegretto_metadatas: Metadatas<ContextCell<TContext>>,
validators_metadata: Metadata<ContextCell<TContext>, U64, ValidatorState>,
metrics: Metrics,
}Fields§
§config: Config<TPeerManager>The actor configuration passed in when constructing the actor.
context: ContextCell<TContext>The runtime context passed in when constructing the actor.
mailbox: UnboundedReceiver<Message>The channel over which the actor will receive messages.
ceremony_metadata: Arc<Mutex<Metadata<ContextCell<TContext>, U64, State>>>Persisted information on the currently running ceremony and its predecessor (epochs i and i-1). This ceremony metadata is updated on the last height of en epoch (the height on which the ceremony for the next epoch will be started).
post_allegretto_metadatas: Metadatas<ContextCell<TContext>>Persisted information on the current epoch for DKG ceremonies that were started after the allegretto hardfork.
pre_allegretto_metadatas: Metadatas<ContextCell<TContext>>Persisted information on the current epoch for DKG ceremonies that were started before the allegretto hardfork.
validators_metadata: Metadata<ContextCell<TContext>, U64, ValidatorState>Information on the peers registered on the p2p peer manager for a given epoch i and its precursors i-1 and i-2. Peer information is persisted on the last height of an epoch.
Note that validators are also persisted in the epoch metadata and are the main source of truth. The validators are also tracked here so that they can be registered as peers for older epoch states that are no longer tracked.
metrics: MetricsHandles to the metrics objects that the actor will update during its runtime.
Implementations§
Source§impl<TContext, TPeerManager> Actor<TContext, TPeerManager>where
TContext: Clock + CryptoRngCore + Metrics + Spawner + Storage,
TPeerManager: Manager<PublicKey = PublicKey, Peers = OrderedAssociated<PublicKey, SocketAddr>>,
impl<TContext, TPeerManager> Actor<TContext, TPeerManager>where
TContext: Clock + CryptoRngCore + Metrics + Spawner + Storage,
TPeerManager: Manager<PublicKey = PublicKey, Peers = OrderedAssociated<PublicKey, SocketAddr>>,
pub(super) async fn post_allegretto_init(&mut self) -> Result<()>
Sourcepub(super) async fn handle_finalized_post_allegretto<TReceiver, TSender>(
&mut self,
cause: Span,
block: Block,
maybe_ceremony: &mut Option<Ceremony<ContextCell<TContext>, TReceiver, TSender>>,
ceremony_mux: &mut MuxHandle<TSender, TReceiver>,
)where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
pub(super) async fn handle_finalized_post_allegretto<TReceiver, TSender>(
&mut self,
cause: Span,
block: Block,
maybe_ceremony: &mut Option<Ceremony<ContextCell<TContext>, TReceiver, TSender>>,
ceremony_mux: &mut MuxHandle<TSender, TReceiver>,
)where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
Handles a finalized block.
Some block heights are special cased:
- first height of an epoch: notify the epoch manager that the previous epoch can be shut down.
- pre-to-last height of an epoch: finalize the ceremony and generate the the state for the next ceremony.
- last height of an epoch:
- notify the epoch manager that a new epoch can be entered;
- start a new ceremony by reading the validator config smart contract
The processing of all other blocks depends on which part of the epoch they fall in:
- first half: if we are a dealer, distribute the generated DKG shares to the players and collect their acks. If we are a player, receive DKG shares and respond with an ack.
- exact middle of an epoch: if we are a dealer, generate the dealing (the intermediate outcome) of the ceremony.
- second half of an epoch: if we are a dealer, send it to the application if a request comes in (the application is supposed to add this to the block it is proposing). Always attempt to read dealings from the blocks and track them (if a dealer or player both).
pub(super) async fn transition_from_static_validator_sets<TReceiver, TSender>(
&mut self,
pre_allegretto_epoch_state: EpochState,
mux: &mut MuxHandle<TSender, TReceiver>,
) -> Result<Ceremony<ContextCell<TContext>, TReceiver, TSender>>where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
pub(super) async fn start_post_allegretto_ceremony<TReceiver, TSender>(
&mut self,
mux: &mut MuxHandle<TSender, TReceiver>,
) -> Ceremony<ContextCell<TContext>, TReceiver, TSender>where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
async fn update_and_register_current_epoch_state(&mut self)
Sourceasync fn enter_current_epoch_and_remove_old_state(&mut self)
async fn enter_current_epoch_and_remove_old_state(&mut self)
Reports that a new epoch was fully entered, that the previous epoch can be ended.
Source§impl<TContext, TPeerManager> Actor<TContext, TPeerManager>where
TContext: Clock + CryptoRngCore + Metrics + Spawner + Storage,
TPeerManager: Manager<PublicKey = PublicKey, Peers = OrderedAssociated<PublicKey, SocketAddr>>,
impl<TContext, TPeerManager> Actor<TContext, TPeerManager>where
TContext: Clock + CryptoRngCore + Metrics + Spawner + Storage,
TPeerManager: Manager<PublicKey = PublicKey, Peers = OrderedAssociated<PublicKey, SocketAddr>>,
Sourcepub(super) async fn pre_allegretto_init(&mut self) -> Result<()>
pub(super) async fn pre_allegretto_init(&mut self) -> Result<()>
Runs the pre-allegretto initialization routines.
This is a no-op if post-allegretto artifacts exists on disk and there no pre-allegretto artifacts remaining. The assumption is that the last pre- allegretto ceremony deletes its state from disk.
If neither pre- nor post-allegretto artifacts are found, this method assumes that the node is starting from genesis.
Sourcepub(super) async fn handle_finalized_pre_allegretto<TReceiver, TSender>(
&mut self,
cause: Span,
block: Block,
maybe_ceremony: &mut Option<Ceremony<ContextCell<TContext>, TReceiver, TSender>>,
ceremony_mux: &mut MuxHandle<TSender, TReceiver>,
)where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
pub(super) async fn handle_finalized_pre_allegretto<TReceiver, TSender>(
&mut self,
cause: Span,
block: Block,
maybe_ceremony: &mut Option<Ceremony<ContextCell<TContext>, TReceiver, TSender>>,
ceremony_mux: &mut MuxHandle<TSender, TReceiver>,
)where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
Handles a finalized block.
Depending on which height of an epoch the block is, this method exhibits different behavior:
- first height of an epoch: notify the epoch manager that the previous epoch can be shut down.
- first half of an epoch: distribute the shares generated during the DKG ceremony and collect shares from other dealers, and acks from other players.
- exact middle of an epoch: generate the intermediate outcome of the ceremony.
- second half of an epoch: read intermediate outcomes from blocks.
- pre-to-last height of an epoch: generate the overall ceremony outcome, update CURRENT_EPOCH_KEY.
- last height of an epoch: notify the epoch manager that a new epoch can be started, using the outcome of the last epoch. Start a new ceremony for the next epoch.
pub(super) async fn start_pre_allegretto_ceremony<TReceiver, TSender>(
&mut self,
mux: &mut MuxHandle<TSender, TReceiver>,
) -> Ceremony<ContextCell<TContext>, TReceiver, TSender>where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
async fn transition_to_dynamic_validator_sets<TReceiver, TSender>(
&mut self,
mux: &mut MuxHandle<TSender, TReceiver>,
) -> Result<Ceremony<ContextCell<TContext>, TReceiver, TSender>>where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
Source§impl<TContext, TPeerManager> Actor<TContext, TPeerManager>where
TContext: Clock + CryptoRngCore + Metrics + Spawner + Storage,
TPeerManager: Manager<PublicKey = PublicKey, Peers = OrderedAssociated<PublicKey, SocketAddr>>,
impl<TContext, TPeerManager> Actor<TContext, TPeerManager>where
TContext: Clock + CryptoRngCore + Metrics + Spawner + Storage,
TPeerManager: Manager<PublicKey = PublicKey, Peers = OrderedAssociated<PublicKey, SocketAddr>>,
pub(super) async fn new( config: Config<TPeerManager>, context: TContext, mailbox: UnboundedReceiver<Message>, ) -> Result<Self>
async fn run( self, __arg1: (impl Sender<PublicKey = PublicKey>, impl Receiver<PublicKey = PublicKey>), )
pub(crate) fn start( self, dkg_channel: (impl Sender<PublicKey = PublicKey>, impl Receiver<PublicKey = PublicKey>), ) -> Handle<()>
async fn handle_get_intermediate_dealing<TReceiver, TSender>(
&mut self,
cause: Span,
__arg2: GetIntermediateDealing,
ceremony: Option<&mut Ceremony<ContextCell<TContext>, TReceiver, TSender>>,
) -> Result<()>where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
async fn handle_get_outcome( &mut self, cause: Span, __arg2: GetOutcome, ) -> Result<()>
Sourceasync fn handle_finalized<TReceiver, TSender>(
&mut self,
cause: Span,
__arg2: Finalize,
maybe_ceremony: &mut Option<Ceremony<ContextCell<TContext>, TReceiver, TSender>>,
ceremony_mux: &mut MuxHandle<TSender, TReceiver>,
)where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
async fn handle_finalized<TReceiver, TSender>(
&mut self,
cause: Span,
__arg2: Finalize,
maybe_ceremony: &mut Option<Ceremony<ContextCell<TContext>, TReceiver, TSender>>,
ceremony_mux: &mut MuxHandle<TSender, TReceiver>,
)where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
Handles a finalized block.
Some block heights are special cased:
- first height of an epoch: notify the epoch manager that the previous epoch can be shut down.
- pre-to-last height of an epoch: finalize the ceremony and generate the the state for the next ceremony.
- last height of an epoch:
- notify the epoch manager that a new epoch can be entered;
- start a new ceremony by reading the validator config smart contract
The processing of all other blocks depends on which part of the epoch they fall in:
- first half: if we are a dealer, distribute the generated DKG shares to the players and collect their acks. If we are a player, receive DKG shares and respond with an ack.
- exact middle of an epoch: if we are a dealer, generate the dealing (the intermediate outcome) of the ceremony.
- second half of an epoch: if we are a dealer, send it to the application if a request comes in (the application is supposed to add this to the block it is proposing). Always attempt to read dealings from the blocks and track them (if a dealer or player both).
Sourceasync fn start_ceremony_for_current_epoch_state<TReceiver, TSender>(
&mut self,
mux: &mut MuxHandle<TSender, TReceiver>,
) -> Ceremony<ContextCell<TContext>, TReceiver, TSender>where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
async fn start_ceremony_for_current_epoch_state<TReceiver, TSender>(
&mut self,
mux: &mut MuxHandle<TSender, TReceiver>,
) -> Ceremony<ContextCell<TContext>, TReceiver, TSender>where
TReceiver: Receiver<PublicKey = PublicKey>,
TSender: Sender<PublicKey = PublicKey>,
Starts a new ceremony for the epoch state tracked by the actor.
Sourceasync fn register_current_epoch_state(&mut self)
async fn register_current_epoch_state(&mut self)
Registers the new epoch by reporting to the epoch manager that it should be entered and registering its peers on the peers manager.
Sourceasync fn register_previous_epoch_state(&mut self)
async fn register_previous_epoch_state(&mut self)
Reports that the previous epoch should be entered.
This method is called on startup to ensure that a consensus engine for the previous epoch i-1 is started in case the node went down before the new epoch i was firmly locked in.
This method also registers the validators for epochs i-1 and i-2.
§Panics
Panics if no current epoch state exists on disk.
Sourceasync fn register_validators(
&mut self,
epoch: Epoch,
validator_state: ValidatorState,
)
async fn register_validators( &mut self, epoch: Epoch, validator_state: ValidatorState, )
Registers peers derived from validator_state for epoch on the peer manager.
Sourcefn is_running_post_allegretto(&self, block: &Block) -> bool
fn is_running_post_allegretto(&self, block: &Block) -> bool
Returns if the DKG manager is running a post-allegretto ceremony.
The DKG manager is running a post-allegretto ceremony if block.timestamp is after the allegretto timestamp, and if the post-allegretto epoch state is set.
This is to account for ceremonies that are started pre-allegretto, and are running past the hardfork timestamp: we need to run the ceremony to its conclusion and then start a new post-allegretto ceremony at the epoch boundary.
Sourcefn previous_epoch_state(&self) -> Option<EpochState>
fn previous_epoch_state(&self) -> Option<EpochState>
Returns the previous epoch state.
Always prefers the post allegretto state, if it exists.
Sourcefn current_epoch_state(&self) -> EpochState
fn current_epoch_state(&self) -> EpochState
Returns the current epoch state.
Always prefers the post allegretto state, if it exists.
§Panics
Panics if no epoch state exists, neither for the pre- nor post-allegretto regime. There must always be an epoch state.
Auto Trait Implementations§
impl<TContext, TPeerManager> Freeze for Actor<TContext, TPeerManager>
impl<TContext, TPeerManager> !RefUnwindSafe for Actor<TContext, TPeerManager>
impl<TContext, TPeerManager> Send for Actor<TContext, TPeerManager>
impl<TContext, TPeerManager> Sync for Actor<TContext, TPeerManager>where
TPeerManager: Sync,
impl<TContext, TPeerManager> Unpin for Actor<TContext, TPeerManager>
impl<TContext, TPeerManager> !UnwindSafe for Actor<TContext, TPeerManager>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
§fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
TxEnv] from a transaction and a sender address.§impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
§fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
TxEnv] from a transaction, its sender, and encoded transaction bytes.§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling [Attribute] value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi [Quirk] value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the [Condition] value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
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) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
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
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> ServiceExt for T
impl<T> ServiceExt for T
§fn propagate_header(self, header: HeaderName) -> PropagateHeader<Self>where
Self: Sized,
fn propagate_header(self, header: HeaderName) -> PropagateHeader<Self>where
Self: Sized,
propagate-header only.§fn add_extension<T>(self, value: T) -> AddExtension<Self, T>where
Self: Sized,
fn add_extension<T>(self, value: T) -> AddExtension<Self, T>where
Self: Sized,
add-extension only.§fn map_request_body<F>(self, f: F) -> MapRequestBody<Self, F>where
Self: Sized,
fn map_request_body<F>(self, f: F) -> MapRequestBody<Self, F>where
Self: Sized,
map-request-body only.§fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
map-response-body only.§fn compression(self) -> Compression<Self>where
Self: Sized,
fn compression(self) -> Compression<Self>where
Self: Sized,
compression-br or compression-deflate or compression-gzip or compression-zstd only.§fn decompression(self) -> Decompression<Self>where
Self: Sized,
fn decompression(self) -> Decompression<Self>where
Self: Sized,
decompression-br or decompression-deflate or decompression-gzip or decompression-zstd only.§fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
trace only.§fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
trace only.§fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
follow-redirect only.§fn sensitive_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<SetSensitiveResponseHeaders<Self>>where
Self: Sized,
fn sensitive_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<SetSensitiveResponseHeaders<Self>>where
Self: Sized,
sensitive-headers only.§fn sensitive_request_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<Self>where
Self: Sized,
fn sensitive_request_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<Self>where
Self: Sized,
sensitive-headers only.§fn sensitive_response_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveResponseHeaders<Self>where
Self: Sized,
fn sensitive_response_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveResponseHeaders<Self>where
Self: Sized,
sensitive-headers only.§fn override_request_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
fn override_request_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
set-header only.§fn append_request_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
fn append_request_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
set-header only.§fn insert_request_header_if_not_present<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
fn insert_request_header_if_not_present<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
set-header only.§fn override_response_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
fn override_response_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
set-header only.§fn append_response_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
fn append_response_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
set-header only.§fn insert_response_header_if_not_present<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
fn insert_response_header_if_not_present<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
set-header only.§fn set_request_id<M>(
self,
header_name: HeaderName,
make_request_id: M,
) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
fn set_request_id<M>(
self,
header_name: HeaderName,
make_request_id: M,
) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
request-id only.§fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
request-id only.x-request-id as the header name. Read more§fn propagate_request_id(
self,
header_name: HeaderName,
) -> PropagateRequestId<Self>where
Self: Sized,
fn propagate_request_id(
self,
header_name: HeaderName,
) -> PropagateRequestId<Self>where
Self: Sized,
request-id only.§fn propagate_x_request_id(self) -> PropagateRequestId<Self>where
Self: Sized,
fn propagate_x_request_id(self) -> PropagateRequestId<Self>where
Self: Sized,
request-id only.x-request-id as the header name. Read more§fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>where
Self: Sized,
fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>where
Self: Sized,
catch-panic only.500 Internal Server responses. Read more§fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>where
Self: Sized,
fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>where
Self: Sized,
limit only.413 Payload Too Large responses. Read more§fn trim_trailing_slash(self) -> NormalizePath<Self>where
Self: Sized,
fn trim_trailing_slash(self) -> NormalizePath<Self>where
Self: Sized,
normalize-path only.§fn append_trailing_slash(self) -> NormalizePath<Self>where
Self: Sized,
fn append_trailing_slash(self) -> NormalizePath<Self>where
Self: Sized,
normalize-path only.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.§impl<T> TryConv for T
impl<T> TryConv for T
§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSend for Twhere
T: Send,
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.