mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-23 00:00:10 +02:00
* util: remove path deps * ci: run clippy with --all-features * ci: run tests with --all-features on FreeBSD CI
61 lines
1.5 KiB
Rust
61 lines
1.5 KiB
Rust
use crate::Stream;
|
|
use pin_project_lite::pin_project;
|
|
use std::io;
|
|
use std::pin::Pin;
|
|
use std::task::{Context, Poll};
|
|
use tokio::io::{AsyncBufRead, Split};
|
|
|
|
pin_project! {
|
|
/// A wrapper around [`tokio::io::Split`] that implements [`Stream`].
|
|
///
|
|
/// [`tokio::io::Split`]: struct@tokio::io::Split
|
|
/// [`Stream`]: trait@crate::Stream
|
|
#[derive(Debug)]
|
|
#[cfg_attr(docsrs, doc(cfg(feature = "io-util")))]
|
|
pub struct SplitStream<R> {
|
|
#[pin]
|
|
inner: Split<R>,
|
|
}
|
|
}
|
|
|
|
impl<R> SplitStream<R> {
|
|
/// Create a new `SplitStream`.
|
|
pub fn new(split: Split<R>) -> Self {
|
|
Self { inner: split }
|
|
}
|
|
|
|
/// Get back the inner `Split`.
|
|
pub fn into_inner(self) -> Split<R> {
|
|
self.inner
|
|
}
|
|
|
|
/// Obtain a pinned reference to the inner `Split<R>`.
|
|
#[allow(clippy::wrong_self_convention)] // https://github.com/rust-lang/rust-clippy/issues/4546
|
|
pub fn as_pin_mut(self: Pin<&mut Self>) -> Pin<&mut Split<R>> {
|
|
self.project().inner
|
|
}
|
|
}
|
|
|
|
impl<R: AsyncBufRead> Stream for SplitStream<R> {
|
|
type Item = io::Result<Vec<u8>>;
|
|
|
|
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
|
|
self.project()
|
|
.inner
|
|
.poll_next_segment(cx)
|
|
.map(Result::transpose)
|
|
}
|
|
}
|
|
|
|
impl<R> AsRef<Split<R>> for SplitStream<R> {
|
|
fn as_ref(&self) -> &Split<R> {
|
|
&self.inner
|
|
}
|
|
}
|
|
|
|
impl<R> AsMut<Split<R>> for SplitStream<R> {
|
|
fn as_mut(&mut self) -> &mut Split<R> {
|
|
&mut self.inner
|
|
}
|
|
}
|