pdf_parser/src/reader.rs

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)
}
}
}