/ src / sources / file.rs
file.rs
 1  use crate::sources::{Source, SourceLine};
 2  use anyhow::Result;
 3  use std::fs::File;
 4  use std::io::{BufRead, BufReader};
 5  
 6  pub struct FileSource {
 7      lines: std::io::Lines<BufReader<File>>,
 8  }
 9  
10  impl FileSource {
11      pub fn open(path: &str) -> Result<Self> {
12          let file = File::open(path)?;
13          let reader = BufReader::new(file);
14          Ok(Self {
15              lines: reader.lines(),
16          })
17      }
18  }
19  
20  impl Source for FileSource {
21      fn next_line(&mut self) -> Result<Option<SourceLine>> {
22          match self.lines.next() {
23              Some(line) => {
24                  let line = line?;
25                  Ok(Some(SourceLine {
26                      bytes: line.as_bytes().to_vec(),
27                      line,
28                      topic: None,
29                  }))
30              }
31              None => Ok(None),
32          }
33      }
34  }