ddb_core/file_io/
reader.rs

1// Streaming line reader for low memory usage
2use crate::error::Result;
3use std::fs::File;
4use std::io::{BufRead, BufReader};
5use std::path::Path;
6
7pub struct LineReader {
8    reader: BufReader<File>,
9    line_number: usize,
10}
11
12impl LineReader {
13    pub fn new<P: AsRef<Path>>(path: P) -> Result<Self> {
14        let file = File::open(path)?;
15        let reader = BufReader::new(file);
16
17        Ok(Self {
18            reader,
19            line_number: 0,
20        })
21    }
22
23    pub fn current_line(&self) -> usize {
24        self.line_number
25    }
26}
27
28impl Iterator for LineReader {
29    type Item = Result<String>;
30
31    fn next(&mut self) -> Option<Self::Item> {
32        let mut line = String::new();
33
34        match self.reader.read_line(&mut line) {
35            Ok(0) => None, // EOF
36            Ok(_) => {
37                self.line_number += 1;
38                Some(Ok(line))
39            }
40            Err(e) => Some(Err(e.into())),
41        }
42    }
43}