mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-09-02 00:00:11 +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, Lines};
|
|
|
|
pin_project! {
|
|
/// A wrapper around [`tokio::io::Lines`] that implements [`Stream`].
|
|
///
|
|
/// [`tokio::io::Lines`]: struct@tokio::io::Lines
|
|
/// [`Stream`]: trait@crate::Stream
|
|
#[derive(Debug)]
|
|
#[cfg_attr(docsrs, doc(cfg(feature = "io-util")))]
|
|
pub struct LinesStream<R> {
|
|
#[pin]
|
|
inner: Lines<R>,
|
|
}
|
|
}
|
|
|
|
impl<R> LinesStream<R> {
|
|
/// Create a new `LinesStream`.
|
|
pub fn new(lines: Lines<R>) -> Self {
|
|
Self { inner: lines }
|
|
}
|
|
|
|
/// Get back the inner `Lines`.
|
|
pub fn into_inner(self) -> Lines<R> {
|
|
self.inner
|
|
}
|
|
|
|
/// Obtain a pinned reference to the inner `Lines<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 Lines<R>> {
|
|
self.project().inner
|
|
}
|
|
}
|
|
|
|
impl<R: AsyncBufRead> Stream for LinesStream<R> {
|
|
type Item = io::Result<String>;
|
|
|
|
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
|
|
self.project()
|
|
.inner
|
|
.poll_next_line(cx)
|
|
.map(Result::transpose)
|
|
}
|
|
}
|
|
|
|
impl<R> AsRef<Lines<R>> for LinesStream<R> {
|
|
fn as_ref(&self) -> &Lines<R> {
|
|
&self.inner
|
|
}
|
|
}
|
|
|
|
impl<R> AsMut<Lines<R>> for LinesStream<R> {
|
|
fn as_mut(&mut self) -> &mut Lines<R> {
|
|
&mut self.inner
|
|
}
|
|
}
|