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}