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 }