Skip to main content

Circuit

Struct Circuit 

Source
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: DynTimeProvider

The time provider.

§channel: Arc<Channel>

The channel this circuit is attached to.

§chan_sender: CircuitCellSender

Sender 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: InboundClientCrypt

The 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: OutboundClientCrypt

The cryptographic state for this circuit for outbound cells.

§hops: CircHopList

List of hops state objects used by the reactor

§mutable: Arc<MutableState>

Mutable information about this circuit, shared with the reactor’s ConfluxSet.

§channel_id: CircId

This circuit’s identifier on the upstream channel.

§unique_id: TunnelScopedCircId

An 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: PaddingController

A padding controller to which padding-related events should be reported.

§padding_event_stream: PaddingEventStream

An 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: CircuitAccount

Memory quota account

Implementations§

Source§

impl Circuit

Source

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.

Source

pub(super) fn unique_id(&self) -> UniqId

Return the process-unique identifier of this circuit.

Source

pub(super) fn mutable(&self) -> &Arc<MutableState>

Return the shared mutable state of this circuit.

Source

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.

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

fn decode_relay_cell( &mut self, cell: Relay, ) -> Result<(HopNum, SendmeTag, RelayCellDecoderResult)>

Decode cell, returning its corresponding hop number, tag, and decoded body.

Source

fn handle_relay_cell( &mut self, handlers: &mut CellHandlers, leg: UniqId, cell: Relay, ) -> Result<Vec<CircuitCmd>>

React to a Relay or RelayEarly cell.

Source

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.

Source

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.

Source

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
Source

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.

Source

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.

Source

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.

Source

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.

Source

fn handle_destroy_cell(&mut self) -> Result<CircuitCmd>

Helper: process a destroy cell.

Source

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.

Source

async fn create_impl<H, W, M>( &mut self, recvcreated: Receiver<CreateResponse>, wrap: &W, key: &H::KeyType, settings: HopSettings, msg: &M, ) -> Result<()>

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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:

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.

Source

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.

Source

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

Source

pub(super) fn remove_expired_halfstreams(&mut self, now: Instant)

Remove all halfstreams that are expired at now.

Source

pub(super) fn hop(&self, hopnum: HopNum) -> Option<&CircHop>

Return a reference to the hop corresponding to hopnum, if there is one.

Source

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.

Source

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.

Source

pub(super) async fn close_stream( &mut self, hop_num: HopNum, sid: StreamId, behav: CloseStreamBehavior, reason: TerminateReason, expiry: Instant, ) -> Result<()>

Close the specified stream

Source

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.

Source

pub(super) fn num_hops(&self) -> u8

The number of hops in this circuit.

Source

pub(super) fn has_hops(&self) -> bool

Check whether this circuit has any hops.

Source

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.

Source

pub(super) fn path(&self) -> Arc<Path>

Get the path of the circuit.

Warning: Do not call while already holding the Self::mutable lock.

Source

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.

Source

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.

Source

pub(super) fn is_conflux_pending(&self) -> bool

Returns whether this is a conflux circuit that is not linked yet.

Source

pub(super) fn conflux_status(&self) -> Option<ConfluxStatus>

Returns the conflux status of this circuit.

Returns None if this is not a conflux circuit.

Source

pub(super) fn init_rtt(&self) -> Option<Duration>

Returns initial RTT on this leg, measured in the conflux handshake.

Source

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.

Source

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.

Source

pub(super) async fn send_padding( &mut self, send_padding: SendPadding, ) -> Result<()>

Handle a request from our padding subsystem to send a padding packet.

Source

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.

Source

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.

Source

pub(super) fn stop_blocking_for_padding(&mut self)

Disable padding-based blocking.

Source

pub(super) fn estimate_cbt(&self, length: usize) -> Duration

The estimated circuit build timeout for a circuit of the specified length.

Trait Implementations§

Source§

impl Drop for Circuit

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

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

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

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

Source§

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

Source§

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

impl<T> Conv for T

Source§

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

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

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

Source§

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

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

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

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

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

Source§

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

impl<T> FmtForward for T

Source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

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

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

Source§

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

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

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

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

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

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

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

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

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

impl<T> PossiblyOption<T> for T

Source§

fn to_option(self) -> Option<T>

Convert this object into an Option<T>
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

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

Immutable access to a value. Read more
Source§

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

Mutable access to a value. Read more
Source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

impl<T> TryConv for T

Source§

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

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

Source§

fn vzip(self) -> V

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