Skip to main content

async_rev_buf/
lines.rs

1use crate::buf_reader::RevBufReader;
2use std::io::Result as IoResult;
3use tokio::io::{AsyncRead, AsyncSeek};
4
5/// Optimized streaming interface for reading lines in reverse
6#[derive(Debug)]
7#[must_use = "streams do nothing unless polled"]
8pub struct Lines<R> {
9    reader: RevBufReader<R>,
10}
11
12impl<R> Lines<R> {
13    pub(crate) fn new(reader: RevBufReader<R>) -> Self {
14        Self { reader }
15    }
16}
17
18impl<R: AsyncRead + AsyncSeek + Unpin> Lines<R> {
19    /// Returns the next line in reverse order, following tokio patterns
20    ///
21    /// # Examples
22    ///
23    /// ```rust
24    /// use async_rev_buf::RevBufReader;
25    /// use std::io::Cursor;
26    ///
27    /// async fn example() -> std::io::Result<()> {
28    ///     let data = "first line\nsecond line\nthird line";
29    ///     let cursor = Cursor::new(data);
30    ///     let reader = RevBufReader::new(cursor);
31    ///     let mut lines = reader.lines();
32    ///
33    ///     // Read lines in reverse order
34    ///     assert_eq!(lines.next_line().await?, Some("third line".to_string()));
35    ///     assert_eq!(lines.next_line().await?, Some("second line".to_string()));
36    ///     assert_eq!(lines.next_line().await?, Some("first line".to_string()));
37    ///     assert_eq!(lines.next_line().await?, None);
38    ///     Ok(())
39    /// }
40    /// ```
41    pub async fn next_line(&mut self) -> IoResult<Option<String>> {
42        self.reader.next_line().await
43    }
44
45    /// Returns a reference to the underlying `RevBufReader`
46    pub fn get_ref(&self) -> &RevBufReader<R> {
47        &self.reader
48    }
49
50    /// Returns a mutable reference to the underlying `RevBufReader`
51    pub fn get_mut(&mut self) -> &mut RevBufReader<R> {
52        &mut self.reader
53    }
54
55    /// Consumes this `Lines`, returning the underlying reader
56    pub fn into_inner(self) -> RevBufReader<R> {
57        self.reader
58    }
59}