use std::io;
use bytes::Bytes;
use futures::StreamExt;
use crate::*;
pub struct StdBytesIterator {
handle: tokio::runtime::Handle,
inner: Option<FuturesBytesStream>,
}
impl StdBytesIterator {
#[inline]
pub(crate) fn new(handle: tokio::runtime::Handle, inner: FuturesBytesStream) -> Self {
StdBytesIterator {
handle,
inner: Some(inner),
}
}
}
impl Iterator for StdBytesIterator {
type Item = io::Result<Bytes>;
fn next(&mut self) -> Option<Self::Item> {
let Some(inner) = self.inner.as_mut() else {
return Some(Err(Error::new(
ErrorKind::Unexpected,
"reader has been dropped",
)
.into()));
};
self.handle.block_on(inner.next())
}
}
impl Drop for StdBytesIterator {
fn drop(&mut self) {
if let Some(v) = self.inner.take() {
self.handle.block_on(async move { drop(v) });
}
}
}