pub struct Cursor<T> { /* private fields */ }Expand description
A Cursor streams the result of a query. When a query is made, the returned Cursor will
contain the first batch of results from the server; the individual results will then be returned
as the Cursor is iterated. When the batch is exhausted and if there are more results, the
Cursor will fetch the next batch of documents, and so forth until the results are exhausted.
Note that because of this batching, additional network I/O may occur on any given call to
next. Because of this, a Cursor iterates over Result<T> items rather than
simply T items.
The batch size of the Cursor can be configured using the options to the method that returns
it. For example, setting the batch_size field of
FindOptions will set the batch size of the
Cursor returned by Collection::find.
Note that the batch size determines both the number of documents stored in memory by the
Cursor at a given time as well as the total number of network round-trips needed to fetch all
results from the server; both of these factors should be taken into account when choosing the
optimal batch size.
Cursor implements Stream, which means
it can be iterated over much in the same way that an Iterator can be in synchronous Rust. In
order to do so, the StreamExt trait must
be imported. Because a Cursor iterates over a Result<T>, it also has access to the
potentially more ergonomic functionality provided by
TryStreamExt, which can be
imported instead of or in addition to
StreamExt. The methods from
TryStreamExt are especially useful when
used in conjunction with the ? operator.
use futures::stream::{StreamExt, TryStreamExt};
let mut cursor = coll.find(None, None).await?;
// regular Stream uses next() and iterates over Option<Result<T>>
while let Some(doc) = cursor.next().await {
println!("{}", doc?)
}
// regular Stream uses collect() and collects into a Vec<Result<T>>
let v: Vec<Result<_>> = cursor.collect().await;
let mut cursor = coll.find(None, None).await?;
// TryStream uses try_next() and iterates over Result<Option<T>>
while let Some(doc) = cursor.try_next().await? {
println!("{}", doc)
}
// TryStream uses try_collect() and collects into a Result<Vec<T>>
let v: Vec<_> = cursor.try_collect().await?;Implementations
sourceimpl<T> Cursor<T>
impl<T> Cursor<T>
sourcepub async fn advance(&mut self) -> Result<bool>
pub async fn advance(&mut self) -> Result<bool>
Move the cursor forward, potentially triggering requests to the database for more results if the local buffer has been exhausted.
This will keep requesting data from the server until either the cursor is exhausted or batch with results in it has been received.
The return value indicates whether new results were successfully returned (true) or if the cursor has been closed (false).
Note: Cursor::current and Cursor::deserialize_current must only be called after
Cursor::advance returned Ok(true). It is an error to call either of them without
calling Cursor::advance first or after Cursor::advance returns an error / false.
let mut cursor = coll.find(None, None).await?;
while cursor.advance().await? {
println!("{:?}", cursor.current());
}sourcepub fn current(&self) -> &RawDocument
pub fn current(&self) -> &RawDocument
Returns a reference to the current result in the cursor.
Panics
Cursor::advance must return Ok(true) before Cursor::current can be
invoked. Calling Cursor::current after Cursor::advance does not return true
or without calling Cursor::advance at all may result in a panic.
let mut cursor = coll.find(None, None).await?;
while cursor.advance().await? {
println!("{:?}", cursor.current());
}sourcepub fn deserialize_current<'a>(&'a self) -> Result<T>where
T: Deserialize<'a>,
pub fn deserialize_current<'a>(&'a self) -> Result<T>where
T: Deserialize<'a>,
Deserialize the current result to the generic type associated with this cursor.
Panics
Cursor::advance must return Ok(true) before Cursor::deserialize_current can be
invoked. Calling Cursor::deserialize_current after Cursor::advance does not return
true or without calling Cursor::advance at all may result in a panic.
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct Cat<'a> {
#[serde(borrow)]
name: &'a str
}
let coll = db.collection::<Cat>("cat");
let mut cursor = coll.find(None, None).await?;
while cursor.advance().await? {
println!("{:?}", cursor.deserialize_current()?);
}sourcepub fn with_type<'a, D>(self) -> Cursor<D>where
D: Deserialize<'a>,
pub fn with_type<'a, D>(self) -> Cursor<D>where
D: Deserialize<'a>,
Update the type streamed values will be parsed as.
Trait Implementations
sourceimpl<T> Stream for Cursor<T>where
T: DeserializeOwned + Unpin + Send + Sync,
impl<T> Stream for Cursor<T>where
T: DeserializeOwned + Unpin + Send + Sync,
Auto Trait Implementations
impl<T> !RefUnwindSafe for Cursor<T>
impl<T> Send for Cursor<T>where
T: Send,
impl<T> !Sync for Cursor<T>
impl<T> Unpin for Cursor<T>where
T: Unpin,
impl<T> !UnwindSafe for Cursor<T>
Blanket Implementations
sourceimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
sourceimpl<T> StreamExt for Twhere
T: Stream + ?Sized,
impl<T> StreamExt for Twhere
T: Stream + ?Sized,
sourcefn next(&mut self) -> Next<'_, Self>where
Self: Unpin,
fn next(&mut self) -> Next<'_, Self>where
Self: Unpin,
sourcefn into_future(self) -> StreamFuture<Self>where
Self: Unpin,
fn into_future(self) -> StreamFuture<Self>where
Self: Unpin,
sourcefn map<T, F>(self, f: F) -> Map<Self, F>where
F: FnMut(Self::Item) -> T,
fn map<T, F>(self, f: F) -> Map<Self, F>where
F: FnMut(Self::Item) -> T,
sourcefn enumerate(self) -> Enumerate<Self>
fn enumerate(self) -> Enumerate<Self>
sourcefn filter<Fut, F>(self, f: F) -> Filter<Self, Fut, F>where
F: FnMut(&Self::Item) -> Fut,
Fut: Future<Output = bool>,
fn filter<Fut, F>(self, f: F) -> Filter<Self, Fut, F>where
F: FnMut(&Self::Item) -> Fut,
Fut: Future<Output = bool>,
sourcefn filter_map<Fut, T, F>(self, f: F) -> FilterMap<Self, Fut, F>where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = Option<T>>,
fn filter_map<Fut, T, F>(self, f: F) -> FilterMap<Self, Fut, F>where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = Option<T>>,
sourcefn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>where
F: FnMut(Self::Item) -> Fut,
Fut: Future,
fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>where
F: FnMut(Self::Item) -> Fut,
Fut: Future,
sourcefn collect<C>(self) -> Collect<Self, C>where
C: Default + Extend<Self::Item>,
fn collect<C>(self) -> Collect<Self, C>where
C: Default + Extend<Self::Item>,
sourcefn unzip<A, B, FromA, FromB>(self) -> Unzip<Self, FromA, FromB>where
FromA: Default + Extend<A>,
FromB: Default + Extend<B>,
Self: Stream<Item = (A, B)>,
fn unzip<A, B, FromA, FromB>(self) -> Unzip<Self, FromA, FromB>where
FromA: Default + Extend<A>,
FromB: Default + Extend<B>,
Self: Stream<Item = (A, B)>,
sourcefn concat(self) -> Concat<Self>where
Self::Item: Extend<<Self::Item as IntoIterator>::Item>,
Self::Item: IntoIterator,
Self::Item: Default,
fn concat(self) -> Concat<Self>where
Self::Item: Extend<<Self::Item as IntoIterator>::Item>,
Self::Item: IntoIterator,
Self::Item: Default,
sourcefn count(self) -> Count<Self>
fn count(self) -> Count<Self>
sourcefn 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>,
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>,
sourcefn any<Fut, F>(self, f: F) -> Any<Self, Fut, F>where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = bool>,
fn any<Fut, F>(self, f: F) -> Any<Self, Fut, F>where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = bool>,
true if any element in stream satisfied a predicate. Read moresourcefn all<Fut, F>(self, f: F) -> All<Self, Fut, F>where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = bool>,
fn all<Fut, F>(self, f: F) -> All<Self, Fut, F>where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = bool>,
true if all element in stream satisfied a predicate. Read moresourcefn flatten(self) -> Flatten<Self>where
Self::Item: Stream,
fn flatten(self) -> Flatten<Self>where
Self::Item: Stream,
sourcefn flatten_unordered(
self,
limit: impl Into<Option<usize>>
) -> FlattenUnordered<Self>where
Self::Item: Stream,
Self::Item: Unpin,
fn flatten_unordered(
self,
limit: impl Into<Option<usize>>
) -> FlattenUnordered<Self>where
Self::Item: Stream,
Self::Item: Unpin,
sourcefn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>where
F: FnMut(Self::Item) -> U,
U: Stream,
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>where
F: FnMut(Self::Item) -> U,
U: Stream,
sourcefn 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,
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,
StreamExt::map but flattens nested Streams
and polls them concurrently, yielding items in any order, as they made
available. Read moresourcefn 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>>,
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>>,
StreamExt::fold that holds internal state
and produces a new stream. Read moresourcefn skip_while<Fut, F>(self, f: F) -> SkipWhile<Self, Fut, F>where
F: FnMut(&Self::Item) -> Fut,
Fut: Future<Output = bool>,
fn skip_while<Fut, F>(self, f: F) -> SkipWhile<Self, Fut, F>where
F: FnMut(&Self::Item) -> Fut,
Fut: Future<Output = bool>,
true. Read moresourcefn take_while<Fut, F>(self, f: F) -> TakeWhile<Self, Fut, F>where
F: FnMut(&Self::Item) -> Fut,
Fut: Future<Output = bool>,
fn take_while<Fut, F>(self, f: F) -> TakeWhile<Self, Fut, F>where
F: FnMut(&Self::Item) -> Fut,
Fut: Future<Output = bool>,
true. Read moresourcefn take_until<Fut>(self, fut: Fut) -> TakeUntil<Self, Fut>where
Fut: Future,
fn take_until<Fut>(self, fut: Fut) -> TakeUntil<Self, Fut>where
Fut: Future,
sourcefn for_each<Fut, F>(self, f: F) -> ForEach<Self, Fut, F>where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = ()>,
fn for_each<Fut, F>(self, f: F) -> ForEach<Self, Fut, F>where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = ()>,
sourcefn 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 = ()>,
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 = ()>,
sourcefn take(self, n: usize) -> Take<Self>
fn take(self, n: usize) -> Take<Self>
n items of the underlying stream. Read moresourcefn skip(self, n: usize) -> Skip<Self>
fn skip(self, n: usize) -> Skip<Self>
n items of the underlying stream. Read moresourcefn catch_unwind(self) -> CatchUnwind<Self>where
Self: UnwindSafe,
fn catch_unwind(self) -> CatchUnwind<Self>where
Self: UnwindSafe,
sourcefn boxed<'a>(
self
) -> Pin<Box<dyn Stream<Item = Self::Item> + Send + 'a, Global>>where
Self: 'a + Send,
fn boxed<'a>(
self
) -> Pin<Box<dyn Stream<Item = Self::Item> + Send + 'a, Global>>where
Self: 'a + Send,
sourcefn boxed_local<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + 'a, Global>>where
Self: 'a,
fn boxed_local<'a>(self) -> Pin<Box<dyn Stream<Item = Self::Item> + 'a, Global>>where
Self: 'a,
sourcefn buffered(self, n: usize) -> Buffered<Self>where
Self::Item: Future,
fn buffered(self, n: usize) -> Buffered<Self>where
Self::Item: Future,
sourcefn buffer_unordered(self, n: usize) -> BufferUnordered<Self>where
Self::Item: Future,
fn buffer_unordered(self, n: usize) -> BufferUnordered<Self>where
Self::Item: Future,
sourcefn zip<St>(self, other: St) -> Zip<Self, St>where
St: Stream,
fn zip<St>(self, other: St) -> Zip<Self, St>where
St: Stream,
sourcefn chain<St>(self, other: St) -> Chain<Self, St>where
St: Stream<Item = Self::Item>,
fn chain<St>(self, other: St) -> Chain<Self, St>where
St: Stream<Item = Self::Item>,
sourcefn peekable(self) -> Peekable<Self>
fn peekable(self) -> Peekable<Self>
peek method. Read moresourcefn chunks(self, capacity: usize) -> Chunks<Self>
fn chunks(self, capacity: usize) -> Chunks<Self>
sourcefn ready_chunks(self, capacity: usize) -> ReadyChunks<Self>
fn ready_chunks(self, capacity: usize) -> ReadyChunks<Self>
sourcefn forward<S>(self, sink: S) -> Forward<Self, S>where
S: Sink<Self::Ok, Error = Self::Error>,
Self: TryStream,
fn forward<S>(self, sink: S) -> Forward<Self, S>where
S: Sink<Self::Ok, Error = Self::Error>,
Self: TryStream,
sourcefn inspect<F>(self, f: F) -> Inspect<Self, F>where
F: FnMut(&Self::Item),
fn inspect<F>(self, f: F) -> Inspect<Self, F>where
F: FnMut(&Self::Item),
sourcefn left_stream<B>(self) -> Either<Self, B>where
B: Stream<Item = Self::Item>,
fn left_stream<B>(self) -> Either<Self, B>where
B: Stream<Item = Self::Item>,
sourcefn right_stream<B>(self) -> Either<B, Self>where
B: Stream<Item = Self::Item>,
fn right_stream<B>(self) -> Either<B, Self>where
B: Stream<Item = Self::Item>,
sourcefn poll_next_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Option<Self::Item>>where
Self: Unpin,
fn poll_next_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Option<Self::Item>>where
Self: Unpin,
sourcefn select_next_some(&mut self) -> SelectNextSome<'_, Self>where
Self: Unpin + FusedStream,
fn select_next_some(&mut self) -> SelectNextSome<'_, Self>where
Self: Unpin + FusedStream,
sourceimpl<S, T, E> TryStream for Swhere
S: Stream<Item = Result<T, E>> + ?Sized,
impl<S, T, E> TryStream for Swhere
S: Stream<Item = Result<T, E>> + ?Sized,
sourceimpl<S> TryStreamExt for Swhere
S: TryStream + ?Sized,
impl<S> TryStreamExt for Swhere
S: TryStream + ?Sized,
sourcefn err_into<E>(self) -> ErrInto<Self, E>where
Self::Error: Into<E>,
fn err_into<E>(self) -> ErrInto<Self, E>where
Self::Error: Into<E>,
sourcefn map_ok<T, F>(self, f: F) -> MapOk<Self, F>where
F: FnMut(Self::Ok) -> T,
fn map_ok<T, F>(self, f: F) -> MapOk<Self, F>where
F: FnMut(Self::Ok) -> T,
sourcefn map_err<E, F>(self, f: F) -> MapErr<Self, F>where
F: FnMut(Self::Error) -> E,
fn map_err<E, F>(self, f: F) -> MapErr<Self, F>where
F: FnMut(Self::Error) -> E,
sourcefn and_then<Fut, F>(self, f: F) -> AndThen<Self, Fut, F>where
F: FnMut(Self::Ok) -> Fut,
Fut: TryFuture<Error = Self::Error>,
fn and_then<Fut, F>(self, f: F) -> AndThen<Self, Fut, F>where
F: FnMut(Self::Ok) -> Fut,
Fut: TryFuture<Error = Self::Error>,
f. Read moresourcefn or_else<Fut, F>(self, f: F) -> OrElse<Self, Fut, F>where
F: FnMut(Self::Error) -> Fut,
Fut: TryFuture<Ok = Self::Ok>,
fn or_else<Fut, F>(self, f: F) -> OrElse<Self, Fut, F>where
F: FnMut(Self::Error) -> Fut,
Fut: TryFuture<Ok = Self::Ok>,
f. Read moresourcefn inspect_ok<F>(self, f: F) -> InspectOk<Self, F>where
F: FnMut(&Self::Ok),
fn inspect_ok<F>(self, f: F) -> InspectOk<Self, F>where
F: FnMut(&Self::Ok),
sourcefn inspect_err<F>(self, f: F) -> InspectErr<Self, F>where
F: FnMut(&Self::Error),
fn inspect_err<F>(self, f: F) -> InspectErr<Self, F>where
F: FnMut(&Self::Error),
sourcefn into_stream(self) -> IntoStream<Self>
fn into_stream(self) -> IntoStream<Self>
sourcefn try_next(&mut self) -> TryNext<'_, Self>where
Self: Unpin,
fn try_next(&mut self) -> TryNext<'_, Self>where
Self: Unpin,
sourcefn try_for_each<Fut, F>(self, f: F) -> TryForEach<Self, Fut, F>where
F: FnMut(Self::Ok) -> Fut,
Fut: TryFuture<Ok = (), Error = Self::Error>,
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>,
sourcefn 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>,
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>,
true. Read moresourcefn 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>,
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>,
true. Read moresourcefn 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>>,
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>>,
sourcefn try_collect<C>(self) -> TryCollect<Self, C>where
C: Default + Extend<Self::Ok>,
fn try_collect<C>(self) -> TryCollect<Self, C>where
C: Default + Extend<Self::Ok>,
sourcefn try_chunks(self, capacity: usize) -> TryChunks<Self>
fn try_chunks(self, capacity: usize) -> TryChunks<Self>
sourcefn try_filter<Fut, F>(self, f: F) -> TryFilter<Self, Fut, F>where
Fut: Future<Output = bool>,
F: FnMut(&Self::Ok) -> Fut,
fn try_filter<Fut, F>(self, f: F) -> TryFilter<Self, Fut, F>where
Fut: Future<Output = bool>,
F: FnMut(&Self::Ok) -> Fut,
sourcefn 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,
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,
sourcefn try_flatten(self) -> TryFlatten<Self>where
Self::Ok: TryStream,
<Self::Ok as TryStream>::Error: From<Self::Error>,
fn try_flatten(self) -> TryFlatten<Self>where
Self::Ok: TryStream,
<Self::Ok as TryStream>::Error: From<Self::Error>,
sourcefn 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>,
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>,
sourcefn try_concat(self) -> TryConcat<Self>where
Self::Ok: Extend<<Self::Ok as IntoIterator>::Item>,
Self::Ok: IntoIterator,
Self::Ok: Default,
fn try_concat(self) -> TryConcat<Self>where
Self::Ok: Extend<<Self::Ok as IntoIterator>::Item>,
Self::Ok: IntoIterator,
Self::Ok: Default,
sourcefn try_buffer_unordered(self, n: usize) -> TryBufferUnordered<Self>where
Self::Ok: TryFuture,
<Self::Ok as TryFuture>::Error == Self::Error,
fn try_buffer_unordered(self, n: usize) -> TryBufferUnordered<Self>where
Self::Ok: TryFuture,
<Self::Ok as TryFuture>::Error == Self::Error,
sourcefn try_buffered(self, n: usize) -> TryBuffered<Self>where
Self::Ok: TryFuture,
<Self::Ok as TryFuture>::Error == Self::Error,
fn try_buffered(self, n: usize) -> TryBuffered<Self>where
Self::Ok: TryFuture,
<Self::Ok as TryFuture>::Error == Self::Error,
sourcefn try_poll_next_unpin(
&mut self,
cx: &mut Context<'_>
) -> Poll<Option<Result<Self::Ok, Self::Error>>>where
Self: Unpin,
fn try_poll_next_unpin(
&mut self,
cx: &mut Context<'_>
) -> Poll<Option<Result<Self::Ok, Self::Error>>>where
Self: Unpin,
sourcefn into_async_read(self) -> IntoAsyncRead<Self>where
Self: TryStreamExt<Error = Error>,
Self::Ok: AsRef<[u8]>,
fn into_async_read(self) -> IntoAsyncRead<Self>where
Self: TryStreamExt<Error = Error>,
Self::Ok: AsRef<[u8]>,
AsyncBufRead. Read more