Skip to main content

Subscription

Struct Subscription 

Source
pub struct Subscription<T: StreamDecoder<T>> { /* private fields */ }
Expand description

Asynchronous subscription for streaming data.

Subscription<T> implements futures::Stream with Item = Result<SubscriptionItem<T>, Error>:

  • None — the stream has ended.
  • Some(Ok(SubscriptionItem::Data(t))) — a decoded value.
  • Some(Ok(SubscriptionItem::Notice(n))) — a non-fatal IB notice (a warning code in WARNING_CODE_RANGE or order-cancel code 202) carried on this subscription’s request_id; the stream stays open.
  • Some(Err(e)) — terminal error; subsequent calls return None.

Consume via StreamExt:

let client = Client::connect("127.0.0.1:4002", 100).await?;
let contract = Contract::stock("AAPL").build();
let mut subscription = client.market_data(&contract).subscribe().await?;

while let Some(item) = subscription.next().await {
    match item {
        Ok(SubscriptionItem::Data(tick))   => println!("tick: {tick:?}"),
        Ok(SubscriptionItem::Notice(n))    => eprintln!("notice: {n}"),
        Err(e)                             => { eprintln!("error: {e}"); break; }
    }
}

Dropping sends the cancel from a task spawned on the client’s runtime, so a subscription may be dropped on any thread, including one with no Tokio runtime. If the client’s runtime has shut down, nothing is sent: the connection went with it.

Clones share the request: dropping a clone only ends that handle, and the request is cancelled when the last clone is dropped. For a shared stream the clones count as one subscription. cancel on any clone ends the request for every clone; cancel_and_drain writes the cancel while the other clones keep reading up to TWS’s end.

When you only care about data, use the SubscriptionItemStreamExt::filter_data adapter to filter notices (logged at warn!):

let mut data = subscription.filter_data();
while let Some(result) = data.next().await { /* result: Result<TickTypes, _> */ }

Notices that are not tied to a specific subscription — connectivity codes 1100/1101/1102, farm-status 2104/2105/2106/2107/2108, etc. — are not delivered here. Subscribe to them via Client::notice_stream instead.

Implementations§

Source§

impl<T: StreamDecoder<T>> Subscription<T>

Source

pub fn request_id(&self) -> Option<i32>

Get the request ID associated with this subscription

Source§

impl<T: StreamDecoder<T> + Send + 'static> Subscription<T>

Source

pub async fn collect_for(&mut self, timeout: Duration) -> Vec<T>

Collects data items into a Vec, bounded by a total wall-clock timeout.

Drives the subscription until the first of: the timeout elapses, the stream ends, a snapshot-end sentinel arrives (e.g. TickTypes::SnapshotEnd), or a terminal error occurs. Notices are filtered (logged at warn!); the snapshot-end sentinel is not included in the returned Vec. On a terminal error the items collected so far are returned (the error is logged at warn!). A broadcast lag (SUBSCRIPTION_LAG_CODE) counts as one: collection stops at the gap, so the rows have no hole.

This is the one-shot snapshot terminal: combined with MarketDataBuilder::snapshot, the request returns one round of data ending in a snapshot sentinel, so timeout acts only as a safety bound. Equivalent to collect_until with a predicate that never fires.

§Examples
use ibapi::prelude::*;
use std::time::Duration;

#[tokio::main]
async fn main() {
    let client = Client::connect("127.0.0.1:4002", 100).await.expect("connection failed");
    let contract = Contract::stock("AAPL").build();
    let mut subscription = client.market_data(&contract).snapshot().subscribe().await.expect("request failed");

    let ticks = subscription.collect_for(Duration::from_secs(5)).await;
    println!("collected {} ticks", ticks.len());
}
Source

pub async fn collect_until( &mut self, timeout: Duration, stop: impl FnMut(&[T]) -> bool, ) -> Vec<T>

Collects data items into a Vec, stopping early once stop is satisfied.

Like collect_for, but after each item is appended the stop predicate is called with the full accumulated slice; returning true ends collection (the triggering item is included). Use it to stop as soon as the fields of interest are populated, rather than waiting out the whole timeout. The same timeout / stream-end / snapshot-end / terminal-error bounds as collect_for still apply.

§Examples
use ibapi::market_data::realtime::TickTypes;
use ibapi::prelude::*;
use std::time::Duration;

#[tokio::main]
async fn main() {
    let client = Client::connect("127.0.0.1:4002", 100).await.expect("connection failed");
    let contract = Contract::stock("AAPL").build();
    let mut subscription = client.market_data(&contract).snapshot().subscribe().await.expect("request failed");

    // Stop as soon as a price tick has arrived.
    let ticks = subscription
        .collect_until(Duration::from_secs(5), |ticks| {
            ticks.iter().any(|t| matches!(t, TickTypes::Price(_) | TickTypes::PriceSize(_)))
        })
        .await;
    println!("collected {} ticks", ticks.len());
}
Source

pub async fn collect_to_end_within( &mut self, timeout: Duration, ) -> Result<Vec<T>, Error>

Collects every data item until TWS’s end marker, or fails once timeout passes.

For requests that end, such as contract details, where a partial result is not a result. Unlike collect_for, running out of time is an error, not a shorter Vec:

OutcomeResult
End marker (or snapshot end)Ok(rows)
Terminal error, such as a TWS rejection (Error::Notice)that error
Consumer fell behind and frames were droppedError::Notice with SUBSCRIPTION_LAG_CODE
Stream closed without the end markerError::UnexpectedEndOfStream
timeout passedError::Timeout; rows read so far are dropped

Notices are logged at warn!. A stream with no end marker (market data) always ends in Timeout; use collect_for for those.

After a timeout the request may still be running at TWS. Dropping the subscription sends TWS’s cancel, where the request type has one; to learn whether the request is over before reusing its id, call cancel_and_drain.

§Examples
use ibapi::prelude::*;
use ibapi::Error;
use std::time::Duration;

#[tokio::main]
async fn main() {
    let client = Client::connect("127.0.0.1:4002", 100).await.expect("connection failed");
    let contract = Contract::stock("AAPL").build();
    let mut subscription = client.contract_details_stream(&contract).subscribe().await.expect("request failed");

    match subscription.collect_to_end_within(Duration::from_secs(30)).await {
        Ok(details) => println!("{} contracts", details.len()),
        Err(Error::Timeout) => eprintln!("no answer in 30s"), // drop sends the cancel
        Err(e) => eprintln!("request failed: {e}"),
    }
}
Source

pub async fn next_batch( &mut self, quiet: Duration, ) -> Option<Result<Vec<T>, Error>>

Returns the next batch of data items: those that arrive together, closed by quiet without an item or by a batch-end marker.

For streams that send an initial dump ending in an end marker, then push updates without one: account summary, account updates, positions and their multi variants. Each push closes once quiet passes without a row; choose quiet longer than the gap between the rows of one push. A gap longer than quiet inside the initial dump splits it: the batch ending in the marker completes it, so check batch.last().

On a stream that never pauses for quiet, such as market data, a batch never closes.

Waits without a time limit until the first item arrives.

OutcomeResult
Batch-end markerSome(Ok(rows)), the marker last
quiet passed after a rowSome(Ok(rows))
Stream endedSome(Ok(rows)) if any were read, else None
Terminal errorSome(Err(_)); rows of the partial batch are dropped
Consumer fell behind and frames were droppedSome(Err(Error::Notice)) with SUBSCRIPTION_LAG_CODE; the stream stays open for the next batch

Notices are logged at warn!.

Not cancel-safe: dropping the future, as tokio::select! does with the branches that lose, drops the rows of the partial batch.

§Examples
use ibapi::prelude::*;
use ibapi::accounts::PositionUpdate;
use std::time::Duration;

#[tokio::main]
async fn main() {
    let client = Client::connect("127.0.0.1:4002", 100).await.expect("connection failed");
    let mut subscription = client.positions().await.expect("request failed");

    while let Some(batch) = subscription.next_batch(Duration::from_secs(1)).await {
        let batch = batch.expect("positions error");
        let initial = matches!(batch.last(), Some(PositionUpdate::PositionEnd));
        println!("{} updates (initial dump: {initial})", batch.len());
    }
}
Source

pub async fn cancel_and_drain(self, deadline: Instant) -> Result<Drained, Error>

Cancel the request and wait, up to deadline, for TWS to confirm it is over, discarding anything that arrives meanwhile.

Use it when the request id must be known finished before it’s reused, or before the next request under strict pacing. Dropping the subscription also cancels, but doesn’t wait for TWS.

OutcomeMeaning
Drained::EndedTWS sent the end marker, before or after the cancel. Nothing is written if it (or a snapshot’s end) had already arrived.
Drained::RejectedTWS answered with an error for the request, before or during the drain.
Drained::UnconfirmedThe deadline passed, or the stream had already ended with an error on our side (such as Error::BufferLimitExceeded). Treat the id as possibly live.
ErrThe connection reset or the client shut down meanwhile.

The cancel is TWS’s native one, where the request type has one (contract details: server 215+); otherwise nothing is written and the drain waits for a natural end. Observed live (server 225), TWS kept sending contract details after the cancel: the rest of a prepared 714-row result, then the end marker; and 8,000+ rows over 150 s of an unfiltered option query with no end marker yet. So the drain usually waits out the whole result: size deadline for it, and prefer narrow queries. A stream with no end marker (market data) always ends Unconfirmed. Subscriptions without a request id (shared, order and order-update streams) are cancelled as by cancel and return Unconfirmed immediately.

Dropping the returned future mid-drain is safe: the cancel write runs in its own task and completes, the subscription drops, and nothing is written twice.

§Examples
use ibapi::prelude::*;
use tokio::time::{Duration, Instant};

#[tokio::main]
async fn main() {
    let client = Client::connect("127.0.0.1:4002", 100).await.expect("connection failed");

    let contract = Contract::stock("AAPL").build();
    let mut subscription = client.contract_details_stream(&contract).subscribe().await.expect("request failed");
    let first = subscription.next().await;
    println!("first row: {first:?}");

    match subscription.cancel_and_drain(Instant::now() + Duration::from_secs(10)).await {
        Ok(Drained::Ended) | Ok(Drained::Rejected(_)) => println!("request finished at TWS"),
        Ok(Drained::Unconfirmed) => println!("not confirmed; don't reuse the request slot yet"),
        Err(e) => eprintln!("session error: {e}"),
    }
}
Source§

impl<T: StreamDecoder<T>> Subscription<T>

Source

pub async fn cancel(&self)

Cancel the subscription.

Writes TWS’s cancel unless the request has already finished (end marker, snapshot end, or a TWS error its type knows ends the request) or its type has none. Either way the stream stops, for every clone: the next poll yields Err(Error::Cancelled), frames not yet read are skipped, and the stream ends. A clone already waiting in next() is woken to yield it. Idempotent.

Trait Implementations§

Source§

impl<T: StreamDecoder<T>> Clone for Subscription<T>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: StreamDecoder<T> + Send + 'static> Stream for Subscription<T>

Source§

type Item = Result<SubscriptionItem<T>, Error>

Values yielded by the stream.
Source§

fn poll_next( self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Option<Self::Item>>

Attempt to pull out the next value of this stream, registering the current task for wakeup if the value is not yet available, and returning None if the stream is exhausted. Read more
Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the stream. Read more

Auto Trait Implementations§

§

impl<T> !Freeze for Subscription<T>

§

impl<T> !RefUnwindSafe for Subscription<T>

§

impl<T> !UnwindSafe for Subscription<T>

§

impl<T> Send for Subscription<T>
where Arc<RequestState<T>>: Send,

§

impl<T> Sync for Subscription<T>
where Arc<RequestState<T>>: Sync,

§

impl<T> Unpin for Subscription<T>
where Arc<RequestState<T>>: Unpin,

§

impl<T> UnsafeUnpin for Subscription<T>
where Arc<RequestState<T>>: UnsafeUnpin,

Blanket Implementations§

Source§

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

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

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

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> StreamExt for T
where T: Stream + ?Sized,

Source§

fn next(&mut self) -> Next<'_, Self> ⓘ
where Self: Unpin,

Creates a future that resolves to the next item in the stream. Read more
Source§

fn into_future(self) -> StreamFuture<Self> ⓘ
where Self: Sized + Unpin,

Converts this stream into a future of (next_item, tail_of_stream). If the stream terminates, then the next item is None. Read more
Source§

fn map<T, F>(self, f: F) -> Map<Self, F>
where F: FnMut(Self::Item) -> T, Self: Sized,

Maps this stream’s items to a different type, returning a new stream of the resulting type. Read more
Source§

fn enumerate(self) -> Enumerate<Self>
where Self: Sized,

Creates a stream which gives the current iteration count as well as the next value. Read more
Source§

fn filter<Fut, F>(self, f: F) -> Filter<Self, Fut, F>
where F: FnMut(&Self::Item) -> Fut, Fut: Future<Output = bool>, Self: Sized,

Filters the values produced by this stream according to the provided asynchronous predicate. Read more
Source§

fn filter_map<Fut, T, F>(self, f: F) -> FilterMap<Self, Fut, F>
where F: FnMut(Self::Item) -> Fut, Fut: Future<Output = Option<T>>, Self: Sized,

Filters the values produced by this stream while simultaneously mapping them to a different type according to the provided asynchronous closure. Read more
Source§

fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
where F: FnMut(Self::Item) -> Fut, Fut: Future, Self: Sized,

Computes from this stream’s items new items of a different type using an asynchronous closure. Read more
Source§

fn collect<C>(self) -> Collect<Self, C> ⓘ
where C: Default + Extend<Self::Item>, Self: Sized,

Transforms a stream into a collection, returning a future representing the result of that computation. Read more
Source§

fn unzip<A, B, FromA, FromB>(self) -> Unzip<Self, FromA, FromB> ⓘ
where FromA: Default + Extend<A>, FromB: Default + Extend<B>, Self: Sized + Stream<Item = (A, B)>,

Converts a stream of pairs into a future, which resolves to pair of containers. Read more
Source§

fn concat(self) -> Concat<Self> ⓘ
where Self: Sized, Self::Item: Extend<<Self::Item as IntoIterator>::Item> + IntoIterator + Default,

Concatenate all items of a stream into a single extendable destination, returning a future representing the end result. Read more
Source§

fn count(self) -> Count<Self> ⓘ
where Self: Sized,

Drives the stream to completion, counting the number of items. Read more
Source§

fn cycle(self) -> Cycle<Self>
where Self: Sized + Clone,

Repeats a stream endlessly. Read more
Source§

fn fold<T, Fut, F>(self, init: T, f: F) -> Fold<Self, Fut, T, F> ⓘ
where F: FnMut(T, Self::Item) -> Fut, Fut: Future<Output = T>, Self: Sized,

Execute an accumulating asynchronous computation over a stream, collecting all the values into one final result. Read more
Source§

fn any<Fut, F>(self, f: F) -> Any<Self, Fut, F> ⓘ
where F: FnMut(Self::Item) -> Fut, Fut: Future<Output = bool>, Self: Sized,

Execute predicate over asynchronous stream, and return true if any element in stream satisfied a predicate. Read more
Source§

fn all<Fut, F>(self, f: F) -> All<Self, Fut, F> ⓘ
where F: FnMut(Self::Item) -> Fut, Fut: Future<Output = bool>, Self: Sized,

Execute predicate over asynchronous stream, and return true if all element in stream satisfied a predicate. Read more
Source§

fn flatten(self) -> Flatten<Self>
where Self::Item: Stream, Self: Sized,

Flattens a stream of streams into just one continuous stream. Read more
Source§

fn flatten_unordered( self, limit: impl Into<Option<usize>>, ) -> FlattenUnorderedWithFlowController<Self, ()>
where Self::Item: Stream + Unpin, Self: Sized,

Flattens a stream of streams into just one continuous stream. Polls inner streams produced by the base stream concurrently. Read more
Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where F: FnMut(Self::Item) -> U, U: Stream, Self: Sized,

Maps a stream like StreamExt::map but flattens nested Streams. Read more
Source§

fn flat_map_unordered<U, F>( self, limit: impl Into<Option<usize>>, f: F, ) -> FlatMapUnordered<Self, U, F>
where U: Stream + Unpin, F: FnMut(Self::Item) -> U, Self: Sized,

Maps a stream like StreamExt::map but flattens nested Streams and polls them concurrently, yielding items in any order, as they made available. Read more
Source§

fn scan<S, B, Fut, F>(self, initial_state: S, f: F) -> Scan<Self, S, Fut, F>
where F: FnMut(&mut S, Self::Item) -> Fut, Fut: Future<Output = Option<B>>, Self: Sized,

Combinator similar to StreamExt::fold that holds internal state and produces a new stream. Read more
Source§

fn skip_while<Fut, F>(self, f: F) -> SkipWhile<Self, Fut, F>
where F: FnMut(&Self::Item) -> Fut, Fut: Future<Output = bool>, Self: Sized,

Skip elements on this stream while the provided asynchronous predicate resolves to true. Read more
Source§

fn take_while<Fut, F>(self, f: F) -> TakeWhile<Self, Fut, F>
where F: FnMut(&Self::Item) -> Fut, Fut: Future<Output = bool>, Self: Sized,

Take elements from this stream while the provided asynchronous predicate resolves to true. Read more
Source§

fn take_until<Fut>(self, fut: Fut) -> TakeUntil<Self, Fut>
where Fut: Future, Self: Sized,

Take elements from this stream until the provided future resolves. Read more
Source§

fn for_each<Fut, F>(self, f: F) -> ForEach<Self, Fut, F> ⓘ
where F: FnMut(Self::Item) -> Fut, Fut: Future<Output = ()>, Self: Sized,

Runs this stream to completion, executing the provided asynchronous closure for each element on the stream. Read more
Source§

fn for_each_concurrent<Fut, F>( self, limit: impl Into<Option<usize>>, f: F, ) -> ForEachConcurrent<Self, Fut, F> ⓘ
where F: FnMut(Self::Item) -> Fut, Fut: Future<Output = ()>, Self: Sized,

Runs this stream to completion, executing the provided asynchronous closure for each element on the stream concurrently as elements become available. Read more
Source§

fn take(self, n: usize) -> Take<Self>
where Self: Sized,

Creates a new stream of at most n items of the underlying stream. Read more
Source§

fn skip(self, n: usize) -> Skip<Self>
where Self: Sized,

Creates a new stream which skips n items of the underlying stream. Read more
Source§

fn fuse(self) -> Fuse<Self>
where Self: Sized,

Fuse a stream such that poll_next will never again be called once it has finished. This method can be used to turn any Stream into a FusedStream. Read more
Source§

fn by_ref(&mut self) -> &mut Self

Borrows a stream, rather than consuming it. Read more
Source§

fn catch_unwind(self) -> CatchUnwind<Self>
where Self: Sized + UnwindSafe,

Catches unwinding panics while polling the stream. Read more
Source§

fn boxed<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + Send + 'a>>
where Self: Sized + Send + 'a,

Wrap the stream in a Box, pinning it. Read more
Source§

fn boxed_local<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + 'a>>
where Self: Sized + 'a,

Wrap the stream in a Box, pinning it. Read more
Source§

fn buffered(self, n: usize) -> Buffered<Self>
where Self::Item: Future, Self: Sized,

An adaptor for creating a buffered list of pending futures. Read more
Source§

fn buffer_unordered(self, n: usize) -> BufferUnordered<Self>
where Self::Item: Future, Self: Sized,

An adaptor for creating a buffered list of pending futures (unordered). Read more
Source§

fn zip<St>(self, other: St) -> Zip<Self, St>
where St: Stream, Self: Sized,

An adapter for zipping two streams together. Read more
Source§

fn chain<St>(self, other: St) -> Chain<Self, St>
where St: Stream<Item = Self::Item>, Self: Sized,

Adapter for chaining two streams. Read more
Source§

fn peekable(self) -> Peekable<Self>
where Self: Sized,

Creates a new stream which exposes a peek method. Read more
Source§

fn chunks(self, capacity: usize) -> Chunks<Self>
where Self: Sized,

An adaptor for chunking up items of the stream inside a vector. Read more
Source§

fn ready_chunks(self, capacity: usize) -> ReadyChunks<Self>
where Self: Sized,

An adaptor for chunking up ready items of the stream inside a vector. Read more
Source§

fn forward<S>(self, sink: S) -> Forward<Self, S> ⓘ
where S: Sink<Self::Ok, Error = Self::Error>, Self: Sized + TryStream,

A future that completes after the given stream has been fully processed into the sink and the sink has been flushed and closed. Read more
Source§

fn split<Item>(self) -> (SplitSink<Self, Item>, SplitStream<Self>)
where Self: Sized + Sink<Item>,

Splits this Stream + Sink object into separate Sink and Stream objects. Read more
Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where F: FnMut(&Self::Item), Self: Sized,

Do something with each item of this stream, afterwards passing it on. Read more
Source§

fn left_stream<B>(self) -> Either<Self, B> ⓘ
where B: Stream<Item = Self::Item>, Self: Sized,

Wrap this stream in an Either stream, making it the left-hand variant of that Either. Read more
Source§

fn right_stream<B>(self) -> Either<B, Self> ⓘ
where B: Stream<Item = Self::Item>, Self: Sized,

Wrap this stream in an Either stream, making it the right-hand variant of that Either. Read more
Source§

fn poll_next_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Option<Self::Item>>
where Self: Unpin,

A convenience method for calling Stream::poll_next on Unpin stream types.
Source§

fn select_next_some(&mut self) -> SelectNextSome<'_, Self> ⓘ
where Self: Unpin + FusedStream,

Returns a Future that resolves when the next item in this stream is ready. Read more
Source§

impl<St> StreamExt for St
where St: Stream + ?Sized,

Source§

fn next(&mut self) -> Next<'_, Self>
where Self: Unpin,

Consumes and returns the next value in the stream or None if the stream is finished. Read more
Source§

fn try_next<T, E>(&mut self) -> TryNext<'_, Self>
where Self: Stream<Item = Result<T, E>> + Unpin,

Consumes and returns the next item in the stream. If an error is encountered before the next item, the error is returned instead. Read more
Source§

fn map<T, F>(self, f: F) -> Map<Self, F>
where F: FnMut(Self::Item) -> T, Self: Sized,

Maps this stream’s items to a different type, returning a new stream of the resulting type. Read more
Source§

fn map_while<T, F>(self, f: F) -> MapWhile<Self, F>
where F: FnMut(Self::Item) -> Option<T>, Self: Sized,

Map this stream’s items to a different type for as long as determined by the provided closure. A stream of the target type will be returned, which will yield elements until the closure returns None. Read more
Source§

fn then<F, Fut>(self, f: F) -> Then<Self, Fut, F>
where F: FnMut(Self::Item) -> Fut, Fut: Future, Self: Sized,

Maps this stream’s items asynchronously to a different type, returning a new stream of the resulting type. Read more
Source§

fn merge<U>(self, other: U) -> Merge<Self, U>
where U: Stream<Item = Self::Item>, Self: Sized,

Combine two streams into one by interleaving the output of both as it is produced. Read more
Source§

fn filter<F>(self, f: F) -> Filter<Self, F>
where F: FnMut(&Self::Item) -> bool, Self: Sized,

Filters the values produced by this stream according to the provided predicate. Read more
Source§

fn filter_map<T, F>(self, f: F) -> FilterMap<Self, F>
where F: FnMut(Self::Item) -> Option<T>, Self: Sized,

Filters the values produced by this stream while simultaneously mapping them to a different type according to the provided closure. Read more
Source§

fn fuse(self) -> Fuse<Self>
where Self: Sized,

Creates a stream which ends after the first None. Read more
Source§

fn take(self, n: usize) -> Take<Self>
where Self: Sized,

Creates a new stream of at most n items of the underlying stream. Read more
Source§

fn take_while<F>(self, f: F) -> TakeWhile<Self, F>
where F: FnMut(&Self::Item) -> bool, Self: Sized,

Take elements from this stream while the provided predicate resolves to true. Read more
Source§

fn skip(self, n: usize) -> Skip<Self>
where Self: Sized,

Creates a new stream that will skip the n first items of the underlying stream. Read more
Source§

fn skip_while<F>(self, f: F) -> SkipWhile<Self, F>
where F: FnMut(&Self::Item) -> bool, Self: Sized,

Skip elements from the underlying stream while the provided predicate resolves to true. Read more
Source§

fn all<F>(&mut self, f: F) -> AllFuture<'_, Self, F>
where Self: Unpin, F: FnMut(Self::Item) -> bool,

Tests if every element of the stream matches a predicate. Read more
Source§

fn any<F>(&mut self, f: F) -> AnyFuture<'_, Self, F>
where Self: Unpin, F: FnMut(Self::Item) -> bool,

Tests if any element of the stream matches a predicate. Read more
Source§

fn chain<U>(self, other: U) -> Chain<Self, U>
where U: Stream<Item = Self::Item>, Self: Sized,

Combine two streams into one by first returning all values from the first stream then all values from the second stream. Read more
Source§

fn fold<B, F>(self, init: B, f: F) -> FoldFuture<Self, B, F>
where Self: Sized, F: FnMut(B, Self::Item) -> B,

A combinator that applies a function to every element in a stream producing a single, final value. Read more
Source§

fn collect<T>( self, ) -> Collect<Self, T, <T as FromStreamPriv<Self::Item>>::InternalCollection>
where T: FromStream<Self::Item>, Self: Sized,

Drain stream pushing all emitted values into a collection. Read more
Source§

fn peekable(self) -> Peekable<Self>
where Self: Sized,

Turns the stream into a peekable stream, whose next element can be peeked at without being consumed. Read more
Source§

impl<S> SubscriptionItemStreamExt for S
where S: Stream,

Source§

fn filter_data<T>(self) -> FilterDataStream<Self>
where Self: Stream<Item = Result<SubscriptionItem<T>, Error>>,

Wrap self in a FilterDataStream adapter that drops SubscriptionItem::Notice items (logging them) and yields the underlying Result<T, Error>.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

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

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

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

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

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<S, T, E> TryStream for S
where S: Stream<Item = Result<T, E>> + ?Sized,

Source§

type Ok = T

The type of successful values yielded by this future
Source§

type Error = E

The type of failures yielded by this future
Source§

fn try_poll_next( self: Pin<&mut S>, cx: &mut Context<'_>, ) -> Poll<Option<Result<<S as TryStream>::Ok, <S as TryStream>::Error>>>

Poll this TryStream as if it were a Stream. Read more
Source§

impl<S> TryStreamExt for S
where S: TryStream + ?Sized,

Source§

fn err_into<E>(self) -> ErrInto<Self, E>
where Self: Sized, Self::Error: Into<E>,

Wraps the current stream in a new stream which converts the error type into the one provided. Read more
Source§

fn map_ok<T, F>(self, f: F) -> MapOk<Self, F>
where Self: Sized, F: FnMut(Self::Ok) -> T,

Wraps the current stream in a new stream which maps the success value using the provided closure. Read more
Source§

fn map_err<E, F>(self, f: F) -> MapErr<Self, F>
where Self: Sized, F: FnMut(Self::Error) -> E,

Wraps the current stream in a new stream which maps the error value using the provided closure. Read more
Source§

fn and_then<Fut, F>(self, f: F) -> AndThen<Self, Fut, F>
where F: FnMut(Self::Ok) -> Fut, Fut: TryFuture<Error = Self::Error>, Self: Sized,

Chain on a computation for when a value is ready, passing the successful results to the provided closure f. Read more
Source§

fn or_else<Fut, F>(self, f: F) -> OrElse<Self, Fut, F>
where F: FnMut(Self::Error) -> Fut, Fut: TryFuture<Ok = Self::Ok>, Self: Sized,

Chain on a computation for when an error happens, passing the erroneous result to the provided closure f. Read more
Source§

fn inspect_ok<F>(self, f: F) -> InspectOk<Self, F>
where F: FnMut(&Self::Ok), Self: Sized,

Do something with the success value of this stream, afterwards passing it on. Read more
Source§

fn inspect_err<F>(self, f: F) -> InspectErr<Self, F>
where F: FnMut(&Self::Error), Self: Sized,

Do something with the error value of this stream, afterwards passing it on. Read more
Source§

fn into_stream(self) -> IntoStream<Self>
where Self: Sized,

Wraps a TryStream into a type that implements Stream Read more
Source§

fn try_next(&mut self) -> TryNext<'_, Self> ⓘ
where Self: Unpin,

Creates a future that attempts to resolve the next item in the stream. If an error is encountered before the next item, the error is returned instead. Read more
Source§

fn try_for_each<Fut, F>(self, f: F) -> TryForEach<Self, Fut, F> ⓘ
where F: FnMut(Self::Ok) -> Fut, Fut: TryFuture<Ok = (), Error = Self::Error>, Self: Sized,

Attempts to run this stream to completion, executing the provided asynchronous closure for each element on the stream. Read more
Source§

fn try_skip_while<Fut, F>(self, f: F) -> TrySkipWhile<Self, Fut, F>
where F: FnMut(&Self::Ok) -> Fut, Fut: TryFuture<Ok = bool, Error = Self::Error>, Self: Sized,

Skip elements on this stream while the provided asynchronous predicate resolves to true. Read more
Source§

fn try_take_while<Fut, F>(self, f: F) -> TryTakeWhile<Self, Fut, F>
where F: FnMut(&Self::Ok) -> Fut, Fut: TryFuture<Ok = bool, Error = Self::Error>, Self: Sized,

Take elements on this stream while the provided asynchronous predicate resolves to true. Read more
Source§

fn try_for_each_concurrent<Fut, F>( self, limit: impl Into<Option<usize>>, f: F, ) -> TryForEachConcurrent<Self, Fut, F> ⓘ
where F: FnMut(Self::Ok) -> Fut, Fut: Future<Output = Result<(), Self::Error>>, Self: Sized,

Attempts to run this stream to completion, executing the provided asynchronous closure for each element on the stream concurrently as elements become available, exiting as soon as an error occurs. Read more
Source§

fn try_collect<C>(self) -> TryCollect<Self, C> ⓘ
where C: Default + Extend<Self::Ok>, Self: Sized,

Attempt to transform a stream into a collection, returning a future representing the result of that computation. Read more
Source§

fn try_chunks(self, capacity: usize) -> TryChunks<Self>
where Self: Sized,

An adaptor for chunking up successful items of the stream inside a vector. Read more
Source§

fn try_ready_chunks(self, capacity: usize) -> TryReadyChunks<Self>
where Self: Sized,

An adaptor for chunking up successful, ready items of the stream inside a vector. Read more
Source§

fn try_filter<Fut, F>(self, f: F) -> TryFilter<Self, Fut, F>
where Fut: Future<Output = bool>, F: FnMut(&Self::Ok) -> Fut, Self: Sized,

Attempt to filter the values produced by this stream according to the provided asynchronous closure. Read more
Source§

fn try_filter_map<Fut, F, T>(self, f: F) -> TryFilterMap<Self, Fut, F>
where Fut: TryFuture<Ok = Option<T>, Error = Self::Error>, F: FnMut(Self::Ok) -> Fut, Self: Sized,

Attempt to filter the values produced by this stream while simultaneously mapping them to a different type according to the provided asynchronous closure. Read more
Source§

fn try_flatten_unordered( self, limit: impl Into<Option<usize>>, ) -> TryFlattenUnordered<Self>
where Self::Ok: TryStream + Unpin, <Self::Ok as TryStream>::Error: From<Self::Error>, Self: Sized,

Flattens a stream of streams into just one continuous stream. Produced streams will be polled concurrently and any errors will be passed through without looking at them. If the underlying base stream returns an error, it will be immediately propagated. Read more
Source§

fn try_flatten(self) -> TryFlatten<Self>
where Self::Ok: TryStream, <Self::Ok as TryStream>::Error: From<Self::Error>, Self: Sized,

Flattens a stream of streams into just one continuous stream. Read more
Source§

fn try_fold<T, Fut, F>(self, init: T, f: F) -> TryFold<Self, Fut, T, F> ⓘ
where F: FnMut(T, Self::Ok) -> Fut, Fut: TryFuture<Ok = T, Error = Self::Error>, Self: Sized,

Attempt to execute an accumulating asynchronous computation over a stream, collecting all the values into one final result. Read more
Source§

fn try_concat(self) -> TryConcat<Self> ⓘ
where Self: Sized, Self::Ok: Extend<<Self::Ok as IntoIterator>::Item> + IntoIterator + Default,

Attempt to concatenate all items of a stream into a single extendable destination, returning a future representing the end result. Read more
Source§

fn try_buffer_unordered(self, n: usize) -> TryBufferUnordered<Self>
where Self::Ok: TryFuture<Error = Self::Error>, Self: Sized,

Attempt to execute several futures from a stream concurrently (unordered). Read more
Source§

fn try_buffered(self, n: usize) -> TryBuffered<Self>
where Self::Ok: TryFuture<Error = Self::Error>, Self: Sized,

Attempt to execute several futures from a stream concurrently. Read more
Source§

fn try_poll_next_unpin( &mut self, cx: &mut Context<'_>, ) -> Poll<Option<Result<Self::Ok, Self::Error>>>
where Self: Unpin,

A convenience method for calling TryStream::try_poll_next on Unpin stream types.
Source§

fn into_async_read(self) -> IntoAsyncRead<Self>
where Self: Sized + TryStreamExt<Error = Error>, Self::Ok: AsRef<[u8]>,

Adapter that converts this stream into an AsyncBufRead. Read more
Source§

fn try_all<Fut, F>(self, f: F) -> TryAll<Self, Fut, F> ⓘ
where Self: Sized, F: FnMut(Self::Ok) -> Fut, Fut: Future<Output = bool>,

Attempt to execute a predicate over an asynchronous stream and evaluate if all items satisfy the predicate. Exits early if an Err is encountered or if an Ok item is found that does not satisfy the predicate. Read more
Source§

fn try_any<Fut, F>(self, f: F) -> TryAny<Self, Fut, F> ⓘ
where Self: Sized, F: FnMut(Self::Ok) -> Fut, Fut: Future<Output = bool>,

Attempt to execute a predicate over an asynchronous stream and evaluate if any items satisfy the predicate. Exits early if an Err is encountered or if an Ok item is found that satisfies the predicate. Read more