43 lines
878 B
Rust
43 lines
878 B
Rust
use std::fs::File;
|
|
use std::io::{self, Read, Seek, SeekFrom, Write};
|
|
use std::slice;
|
|
|
|
type BytesRead = usize;
|
|
|
|
pub struct Reader {
|
|
file: File,
|
|
last_line_start: u64,
|
|
}
|
|
|
|
impl Reader {
|
|
pub fn new(file: File) -> Self {
|
|
Self {
|
|
file,
|
|
last_line_start: 0,
|
|
}
|
|
}
|
|
|
|
pub fn prev_line(&mut self, their_buf: &mut impl Write) -> std::io::Result<BytesRead> {
|
|
let file = &mut self.file;
|
|
if self.last_line_start == 0 {
|
|
Ok(0)
|
|
} else {
|
|
let mut temp = vec![];
|
|
for sub in 1..self.last_line_start {
|
|
file.seek(SeekFrom::Start(self.last_line_start - sub))?;
|
|
let mut byte = 0u8;
|
|
file.read_exact(slice::from_mut(&mut byte))?;
|
|
if byte == b'\n' || sub == self.last_line_start {
|
|
their_buf.write_all(&[byte])?;
|
|
temp.reverse();
|
|
their_buf.write_all(&temp)?;
|
|
return Ok(sub as usize);
|
|
} else {
|
|
temp.push(byte);
|
|
}
|
|
}
|
|
Ok(0)
|
|
}
|
|
}
|
|
}
|