pub(crate) struct Circuit {Show 16 fields
runtime: DynTimeProvider,
channel: Arc<Channel>,
pub(super) chan_sender: CircuitCellSender,
pub(super) input: Receiver<AnyChanMsg, MpscSpec>,
crypto_in: InboundClientCrypt,
crypto_out: OutboundClientCrypt,
pub(super) hops: CircHopList,
mutable: Arc<MutableState>,
channel_id: CircId,
unique_id: TunnelScopedCircId,
conflux_handler: Option<ConfluxMsgHandler>,
padding_ctrl: PaddingController,
pub(super) padding_event_stream: PaddingEventStream,
padding_block: Option<StartBlocking>,
timeouts: Arc<dyn TimeoutEstimator>,
memquota: CircuitAccount,
}Expand description
A circuit “leg” from a tunnel.
Regular (non-multipath) circuits have a single leg.
Conflux (multipath) circuits have N (usually, N = 2).
Fields§
§runtime: DynTimeProviderThe time provider.
channel: Arc<Channel>The channel this circuit is attached to.
chan_sender: CircuitCellSenderSender object used to actually send cells.
NOTE: Control messages could potentially add unboundedly to this, although that’s not likely to happen (and isn’t triggereable from the network, either).
input: Receiver<AnyChanMsg, MpscSpec>Input stream, on which we receive ChanMsg objects from this circuit’s channel.
crypto_in: InboundClientCryptThe cryptographic state for this circuit for inbound cells. This object is divided into multiple layers, each of which is shared with one hop of the circuit.
crypto_out: OutboundClientCryptThe cryptographic state for this circuit for outbound cells.
hops: CircHopListList of hops state objects used by the reactor
mutable: Arc<MutableState>Mutable information about this circuit,
shared with the reactor’s ConfluxSet.
channel_id: CircIdThis circuit’s identifier on the upstream channel.
unique_id: TunnelScopedCircIdAn identifier for logging about this reactor’s circuit.
conflux_handler: Option<ConfluxMsgHandler>A handler for conflux cells.
Set once the conflux handshake is initiated by the reactor
using Reactor::handle_link_circuits.
padding_ctrl: PaddingControllerA padding controller to which padding-related events should be reported.
padding_event_stream: PaddingEventStreamAn event stream telling us about padding-related events.
padding_block: Option<StartBlocking>Current rules for blocking traffic, according to the padding controller.
timeouts: Arc<dyn TimeoutEstimator>The circuit timeout estimator.
Used for computing half-stream expiration.
memquota: CircuitAccountMemory quota account
Implementations§
Source§impl Circuit
impl Circuit
Sourcepub(super) fn new(
runtime: DynTimeProvider,
channel: Arc<Channel>,
channel_id: CircId,
unique_id: TunnelScopedCircId,
input: Receiver<AnyChanMsg, MpscSpec>,
memquota: CircuitAccount,
mutable: Arc<MutableState>,
padding_ctrl: PaddingController,
padding_event_stream: PaddingEventStream,
timeouts: Arc<dyn TimeoutEstimator>,
) -> Self
pub(super) fn new( runtime: DynTimeProvider, channel: Arc<Channel>, channel_id: CircId, unique_id: TunnelScopedCircId, input: Receiver<AnyChanMsg, MpscSpec>, memquota: CircuitAccount, mutable: Arc<MutableState>, padding_ctrl: PaddingController, padding_event_stream: PaddingEventStream, timeouts: Arc<dyn TimeoutEstimator>, ) -> Self
Create a new non-multipath circuit.
Sourcepub(super) fn mutable(&self) -> &Arc<MutableState> ⓘ
pub(super) fn mutable(&self) -> &Arc<MutableState> ⓘ
Return the shared mutable state of this circuit.
Sourcepub(super) fn add_to_conflux_tunnel(
&mut self,
tunnel_id: TunnelId,
conflux_handler: ConfluxMsgHandler,
)
pub(super) fn add_to_conflux_tunnel( &mut self, tunnel_id: TunnelId, conflux_handler: ConfluxMsgHandler, )
Add this circuit to a multipath tunnel, by associating it with a new TunnelId,
and installing a ConfluxMsgHandler on this circuit.
Once this is called, the circuit will be able to handle conflux cells.
Sourcepub(super) async fn begin_conflux_link(
&mut self,
hop: HopNum,
cell: AnyRelayMsgOuter,
runtime: &DynTimeProvider,
) -> Result<()>
pub(super) async fn begin_conflux_link( &mut self, hop: HopNum, cell: AnyRelayMsgOuter, runtime: &DynTimeProvider, ) -> Result<()>
Send a LINK cell to the specified hop.
This must be called after a ConfluxMsgHandler is installed
on the circuit with add_to_conflux_tunnel.
Sourcepub(super) fn conflux_hs_timeout(&self) -> Option<SystemTime>
pub(super) fn conflux_hs_timeout(&self) -> Option<SystemTime>
Get the wallclock time when the handshake on this circuit is supposed to time out.
Returns None if the handshake is not currently in progress.
Sourcefn encode_relay_cell(
crypto_out: &mut OutboundClientCrypt,
relay_format: RelayCellFormat,
hop: HopNum,
early: bool,
msg: AnyRelayMsgOuter,
) -> Result<(AnyChanMsg, SendmeTag)>
fn encode_relay_cell( crypto_out: &mut OutboundClientCrypt, relay_format: RelayCellFormat, hop: HopNum, early: bool, msg: AnyRelayMsgOuter, ) -> Result<(AnyChanMsg, SendmeTag)>
Encode msg and encrypt it, returning the resulting cell
and tag that should be expected for an authenticated SENDME sent
in response to that cell.
Sourcepub(super) async fn send_relay_cell(&mut self, msg: SendRelayCell) -> Result<()>
pub(super) async fn send_relay_cell(&mut self, msg: SendRelayCell) -> Result<()>
Encode msg, encrypt it, and send it to the ’hop’th hop.
If there is insufficient outgoing circuit-level or stream-level SENDME window, an error is returned instead.
Does not check whether the cell is well-formed or reasonable.
NOTE: the reactor should not call this function directly, only via
ConfluxSet::send_relay_cell_on_leg,
which will reroute the message, if necessary to the primary leg.
Sourceasync fn send_relay_cell_inner(
&mut self,
msg: SendRelayCell,
padding_info: Option<QueuedCellPaddingInfo>,
) -> Result<()>
async fn send_relay_cell_inner( &mut self, msg: SendRelayCell, padding_info: Option<QueuedCellPaddingInfo>, ) -> Result<()>
As send_relay_cell, but takes an optional
QueuedCellPaddingInfo in padding_info.
If padding_info is None, msg must be non-padding: we report it as such to the
padding controller.
Sourcepub(super) fn handle_cell(
&mut self,
handlers: &mut CellHandlers,
leg: UniqId,
cell: ClientCircChanMsg,
) -> Result<Vec<CircuitCmd>>
pub(super) fn handle_cell( &mut self, handlers: &mut CellHandlers, leg: UniqId, cell: ClientCircChanMsg, ) -> Result<Vec<CircuitCmd>>
Helper: process a cell on a channel. Most cells get ignored or rejected; a few get delivered to circuits.
Return CellStatus::CleanShutdown if we should exit.
Sourcefn decode_relay_cell(
&mut self,
cell: Relay,
) -> Result<(HopNum, SendmeTag, RelayCellDecoderResult)>
fn decode_relay_cell( &mut self, cell: Relay, ) -> Result<(HopNum, SendmeTag, RelayCellDecoderResult)>
Decode cell, returning its corresponding hop number, tag,
and decoded body.
Sourcefn handle_relay_cell(
&mut self,
handlers: &mut CellHandlers,
leg: UniqId,
cell: Relay,
) -> Result<Vec<CircuitCmd>>
fn handle_relay_cell( &mut self, handlers: &mut CellHandlers, leg: UniqId, cell: Relay, ) -> Result<Vec<CircuitCmd>>
React to a Relay or RelayEarly cell.
Sourcefn handle_relay_msg(
&mut self,
handlers: &mut CellHandlers,
hopnum: HopNum,
leg: UniqId,
cell_counts_toward_windows: bool,
msg: UnparsedRelayMsg,
) -> Result<Option<CircuitCmd>>
fn handle_relay_msg( &mut self, handlers: &mut CellHandlers, hopnum: HopNum, leg: UniqId, cell_counts_toward_windows: bool, msg: UnparsedRelayMsg, ) -> Result<Option<CircuitCmd>>
Handle a single incoming relay message.
Sourcepub(super) fn handle_in_order_relay_msg(
&mut self,
handlers: &mut CellHandlers,
hopnum: HopNum,
leg: UniqId,
cell_counts_toward_windows: bool,
streamid: StreamId,
msg: UnparsedRelayMsg,
) -> Result<Option<CircuitCmd>>
pub(super) fn handle_in_order_relay_msg( &mut self, handlers: &mut CellHandlers, hopnum: HopNum, leg: UniqId, cell_counts_toward_windows: bool, streamid: StreamId, msg: UnparsedRelayMsg, ) -> Result<Option<CircuitCmd>>
Handle a single incoming relay message that is known to be in order.
Sourcefn handle_conflux_msg(
&mut self,
hop: HopNum,
msg: UnparsedRelayMsg,
) -> Result<Option<ConfluxCmd>>
fn handle_conflux_msg( &mut self, hop: HopNum, msg: UnparsedRelayMsg, ) -> Result<Option<ConfluxCmd>>
Handle a conflux message coming from the specified hop.
Returns an error if
- this is not a conflux circuit (i.e. it doesn’t have a
ConfluxMsgHandler) - this is a client circuit and the conflux message originated an unexpected hop
- the cell was sent in violation of the handshake protocol
Sourcepub(super) fn last_seq_sent(&self) -> Result<u64>
pub(super) fn last_seq_sent(&self) -> Result<u64>
For conflux: return the sequence number of the last cell sent on this leg.
Returns an error if this circuit is not part of a conflux set.
Sourcepub(super) fn set_last_seq_sent(&mut self, n: u64) -> Result<()>
pub(super) fn set_last_seq_sent(&mut self, n: u64) -> Result<()>
For conflux: set the sequence number of the last cell sent on this leg.
Returns an error if this circuit is not part of a conflux set.
Sourcepub(super) fn last_seq_recv(&self) -> Result<u64>
pub(super) fn last_seq_recv(&self) -> Result<u64>
For conflux: return the sequence number of the last cell received on this leg.
Returns an error if this circuit is not part of a conflux set.
Sourcefn handle_incoming_stream_request(
&mut self,
handlers: &mut CellHandlers,
msg: UnparsedRelayMsg,
stream_id: StreamId,
hop_num: HopNum,
leg: UniqId,
) -> Result<Option<CircuitCmd>>
fn handle_incoming_stream_request( &mut self, handlers: &mut CellHandlers, msg: UnparsedRelayMsg, stream_id: StreamId, hop_num: HopNum, leg: UniqId, ) -> Result<Option<CircuitCmd>>
A helper for handling incoming stream requests.
Sourcefn handle_destroy_cell(&mut self) -> Result<CircuitCmd>
fn handle_destroy_cell(&mut self) -> Result<CircuitCmd>
Helper: process a destroy cell.
Sourcepub(super) async fn handle_create(
&mut self,
recv_created: Receiver<CreateResponse>,
handshake: CircuitHandshake,
settings: HopSettings,
done: Sender<Result<()>>,
) -> StdResult<(), ReactorError>
pub(super) async fn handle_create( &mut self, recv_created: Receiver<CreateResponse>, handshake: CircuitHandshake, settings: HopSettings, done: Sender<Result<()>>, ) -> StdResult<(), ReactorError>
Handle a CtrlMsg::Create message.
Sourceasync fn create_impl<H, W, M>(
&mut self,
recvcreated: Receiver<CreateResponse>,
wrap: &W,
key: &H::KeyType,
settings: HopSettings,
msg: &M,
) -> Result<()>where
H: ClientHandshake + HandshakeAuxDataHandler,
W: CreateHandshakeWrap,
H::KeyGen: KeyGenerator,
M: Borrow<H::ClientAuxData>,
async fn create_impl<H, W, M>(
&mut self,
recvcreated: Receiver<CreateResponse>,
wrap: &W,
key: &H::KeyType,
settings: HopSettings,
msg: &M,
) -> Result<()>where
H: ClientHandshake + HandshakeAuxDataHandler,
W: CreateHandshakeWrap,
H::KeyGen: KeyGenerator,
M: Borrow<H::ClientAuxData>,
Helper: create the first hop of a circuit.
This is parameterized not just on the RNG, but a wrapper object to build the right kind of create cell, and a handshake object to perform the cryptographic handshake.
Sourceasync fn create_firsthop_fast(
&mut self,
recvcreated: Receiver<CreateResponse>,
settings: HopSettings,
) -> Result<()>
async fn create_firsthop_fast( &mut self, recvcreated: Receiver<CreateResponse>, settings: HopSettings, ) -> Result<()>
Use the (questionable!) CREATE_FAST handshake to connect to the first hop of this circuit.
There’s no authentication in CREATE_FAST, so we don’t need to know whom we’re connecting to: we’re just connecting to whichever relay the channel is for.
Sourceasync fn create_firsthop_ntor(
&mut self,
recvcreated: Receiver<CreateResponse>,
ed_identity: Ed25519Identity,
pubkey: NtorPublicKey,
settings: HopSettings,
) -> Result<()>
async fn create_firsthop_ntor( &mut self, recvcreated: Receiver<CreateResponse>, ed_identity: Ed25519Identity, pubkey: NtorPublicKey, settings: HopSettings, ) -> Result<()>
Use the ntor handshake to connect to the first hop of this circuit.
Note that the provided keys must match the channel’s target, or the handshake will fail.
Sourceasync fn create_firsthop_ntor_v3(
&mut self,
recvcreated: Receiver<CreateResponse>,
pubkey: NtorV3PublicKey,
settings: HopSettings,
) -> Result<()>
async fn create_firsthop_ntor_v3( &mut self, recvcreated: Receiver<CreateResponse>, pubkey: NtorV3PublicKey, settings: HopSettings, ) -> Result<()>
Use the ntor-v3 handshake to connect to the first hop of this circuit.
Note that the provided key must match the channel’s target, or the handshake will fail.
Sourcepub(super) fn add_hop(
&mut self,
peer_id: HopDetail,
fwd: Box<dyn OutboundClientLayer + Send + 'static>,
rev: Box<dyn InboundClientLayer + Send + 'static>,
binding: Option<CircuitBinding>,
settings: &HopSettings,
) -> StdResult<(), Bug>
pub(super) fn add_hop( &mut self, peer_id: HopDetail, fwd: Box<dyn OutboundClientLayer + Send + 'static>, rev: Box<dyn InboundClientLayer + Send + 'static>, binding: Option<CircuitBinding>, settings: &HopSettings, ) -> StdResult<(), Bug>
Add a hop to the end of this circuit.
Will return an error if the circuit already has u8::MAX hops.
Sourcefn handle_meta_cell(
&mut self,
handlers: &mut CellHandlers,
hopnum: HopNum,
msg: UnparsedRelayMsg,
) -> Result<Option<CircuitCmd>>
fn handle_meta_cell( &mut self, handlers: &mut CellHandlers, hopnum: HopNum, msg: UnparsedRelayMsg, ) -> Result<Option<CircuitCmd>>
Handle a RELAY cell on this circuit with stream ID 0.
NOTE(prop349): this is part of Arti’s “Base Circuit Hop Handler”.
This function returns a CircProto error if msg is an unsupported,
unexpected, or otherwise invalid message:
- unexpected messages are rejected by returning an error using
unsupported_client_cell - SENDME/TRUNCATED messages are rejected if they don’t parse
- SENDME authentication tags are validated inside
Circuit::handle_sendme - conflux cells are handled in the client
ConfluxMsgHandler
The error is propagated all the way up to Circuit::handle_cell,
and eventually ends up being returned from the reactor’s run_once function,
causing it to shut down.
Sourcepub(super) fn handle_sendme(
&mut self,
hopnum: HopNum,
msg: Sendme,
signals: CongestionSignals,
) -> Result<Option<CircuitCmd>>
pub(super) fn handle_sendme( &mut self, hopnum: HopNum, msg: Sendme, signals: CongestionSignals, ) -> Result<Option<CircuitCmd>>
Handle a RELAY_SENDME cell on this circuit with stream ID 0.
Sourceasync fn send_msg(
&mut self,
msg: AnyChanMsg,
info: Option<QueuedCellPaddingInfo>,
) -> Result<()>
async fn send_msg( &mut self, msg: AnyChanMsg, info: Option<QueuedCellPaddingInfo>, ) -> Result<()>
Send a message onto the circuit’s channel.
If the channel is ready to accept messages, it will be sent immediately. If not, the message will be enqueued for sending at a later iteration of the reactor loop.
info is the status returned from the padding controller when we told it we were queueing
this data. It should be provided whenever possible.
§Note
Making use of the enqueuing capabilities of this function is discouraged! You should first
check whether the channel is ready to receive messages (self.channel.poll_ready), and
ideally use this to implement backpressure (such that you do not read from other sources
that would send here while you know you’re unable to forward the messages on).
Sourcepub(super) fn remove_expired_halfstreams(&mut self, now: Instant)
pub(super) fn remove_expired_halfstreams(&mut self, now: Instant)
Remove all halfstreams that are expired at now.
Sourcepub(super) fn hop(&self, hopnum: HopNum) -> Option<&CircHop>
pub(super) fn hop(&self, hopnum: HopNum) -> Option<&CircHop>
Return a reference to the hop corresponding to hopnum, if there is one.
Sourcepub(super) fn hop_mut(&mut self, hopnum: HopNum) -> Option<&mut CircHop>
pub(super) fn hop_mut(&mut self, hopnum: HopNum) -> Option<&mut CircHop>
Return a mutable reference to the hop corresponding to hopnum, if there is one.
Sourcepub(super) fn begin_stream(
&mut self,
hop_num: HopNum,
message: AnyRelayMsg,
sender: StreamQueueSender,
rx: Receiver<AnyRelayMsg, MpscSpec>,
rate_limit_notifier: Sender<StreamRateLimit>,
drain_rate_requester: NotifySender<DrainRateRequest>,
cmd_checker: Box<dyn CmdChecker + Send + 'static>,
) -> StdResult<Result<(SendRelayCell, StreamId)>, Bug>
pub(super) fn begin_stream( &mut self, hop_num: HopNum, message: AnyRelayMsg, sender: StreamQueueSender, rx: Receiver<AnyRelayMsg, MpscSpec>, rate_limit_notifier: Sender<StreamRateLimit>, drain_rate_requester: NotifySender<DrainRateRequest>, cmd_checker: Box<dyn CmdChecker + Send + 'static>, ) -> StdResult<Result<(SendRelayCell, StreamId)>, Bug>
Begin a stream with the provided hop in this circuit.
Sourcepub(super) async fn close_stream(
&mut self,
hop_num: HopNum,
sid: StreamId,
behav: CloseStreamBehavior,
reason: TerminateReason,
expiry: Instant,
) -> Result<()>
pub(super) async fn close_stream( &mut self, hop_num: HopNum, sid: StreamId, behav: CloseStreamBehavior, reason: TerminateReason, expiry: Instant, ) -> Result<()>
Close the specified stream
Sourcepub(super) fn has_streams(&self) -> bool
pub(super) fn has_streams(&self) -> bool
Returns true if there are any streams on this circuit
Important: this function locks the stream map of its each of the CircHops
in this circuit, so it must not be called from any function where the
stream map lock is held.
Sourcepub(super) fn last_hop_num(&self) -> Option<HopNum>
pub(super) fn last_hop_num(&self) -> Option<HopNum>
Get the HopNum of the last hop, if this circuit is non-empty.
Returns None if the circuit has no hops.
Sourcepub(super) fn path(&self) -> Arc<Path> ⓘ
pub(super) fn path(&self) -> Arc<Path> ⓘ
Get the path of the circuit.
Warning: Do not call while already holding the Self::mutable lock.
Sourcepub(super) fn clock_skew(&self) -> ClockSkew
pub(super) fn clock_skew(&self) -> ClockSkew
Return a ClockSkew declaring how much clock skew the other side of this channel claimed that we had when we negotiated the connection.
Sourcepub(super) fn uses_stream_sendme(&self, hop: HopNum) -> Option<bool>
pub(super) fn uses_stream_sendme(&self, hop: HopNum) -> Option<bool>
Does congestion control use stream SENDMEs for the given hop?
Returns None if hop doesn’t exist.
Sourcepub(super) fn is_conflux_pending(&self) -> bool
pub(super) fn is_conflux_pending(&self) -> bool
Returns whether this is a conflux circuit that is not linked yet.
Sourcepub(super) fn conflux_status(&self) -> Option<ConfluxStatus>
pub(super) fn conflux_status(&self) -> Option<ConfluxStatus>
Returns the conflux status of this circuit.
Returns None if this is not a conflux circuit.
Sourcepub(super) fn init_rtt(&self) -> Option<Duration>
pub(super) fn init_rtt(&self) -> Option<Duration>
Returns initial RTT on this leg, measured in the conflux handshake.
Sourcepub(super) fn set_padding_at_hop(
&self,
hop: HopNum,
padder: Option<CircuitPadder>,
) -> Result<()>
pub(super) fn set_padding_at_hop( &self, hop: HopNum, padder: Option<CircuitPadder>, ) -> Result<()>
Start or stop padding at the given hop.
Replaces any previous padder at that hop.
Return an error if that hop doesn’t exist.
Sourcefn padding_disposition(
&self,
send_padding: &SendPadding,
) -> CircPaddingDisposition
fn padding_disposition( &self, send_padding: &SendPadding, ) -> CircPaddingDisposition
Determine how exactly to handle a request to handle padding.
This is fairly complicated; see the maybenot documentation for more information.
§Limitations
In our current padding implementation, a circuit is either blocked or not blocked: we do not keep track of which hop is actually doing the blocking.
Sourcepub(super) async fn send_padding(
&mut self,
send_padding: SendPadding,
) -> Result<()>
pub(super) async fn send_padding( &mut self, send_padding: SendPadding, ) -> Result<()>
Handle a request from our padding subsystem to send a padding packet.
Sourceasync fn queue_padding_cell_for_hop(
&mut self,
target_hop: HopNum,
queue_info: Option<QueuedCellPaddingInfo>,
) -> Result<()>
async fn queue_padding_cell_for_hop( &mut self, target_hop: HopNum, queue_info: Option<QueuedCellPaddingInfo>, ) -> Result<()>
Generate and encrypt a padding cell, and send it to a targeted hop.
Ignores any padding-based blocking.
Sourcepub(super) fn start_blocking_for_padding(&mut self, block: StartBlocking)
pub(super) fn start_blocking_for_padding(&mut self, block: StartBlocking)
Enable padding-based blocking,
or change the rule for padding-based blocking to the one in block.
Sourcepub(super) fn stop_blocking_for_padding(&mut self)
pub(super) fn stop_blocking_for_padding(&mut self)
Disable padding-based blocking.
Sourcepub(super) fn estimate_cbt(&self, length: usize) -> Duration
pub(super) fn estimate_cbt(&self, length: usize) -> Duration
The estimated circuit build timeout for a circuit of the specified length.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Circuit
impl !RefUnwindSafe for Circuit
impl Send for Circuit
impl !Sync for Circuit
impl Unpin for Circuit
impl UnsafeUnpin for Circuit
impl !UnwindSafe for Circuit
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§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 moreSource§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 moreSource§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
Source§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
Source§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.Source§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.Source§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.Source§impl<T> PossiblyOption<T> for T
impl<T> PossiblyOption<T> for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.