Skip to content

Commit bf37901

Browse files
committed
Refactor AuthFileReader to use iterator pattern for reading lines
1 parent 43ed0b5 commit bf37901

File tree

2 files changed

+20
-25
lines changed

2 files changed

+20
-25
lines changed

src/auth_file_reader.rs

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@ use std::io::{BufRead, BufReader, Seek, SeekFrom};
44

55
pub struct AuthFileReader {
66
reader: BufReader<File>,
7-
file_content_buffer: String,
87
}
98

109
impl AuthFileReader {
11-
pub fn new(filepath: &str, buffer_size: usize) -> Result<AuthFileReader, Box<dyn Error>> {
10+
pub fn new(filepath: &str) -> Result<AuthFileReader, Box<dyn Error>> {
1211
let file = File::open(filepath)?;
1312
return Ok(AuthFileReader {
1413
reader: BufReader::new(file),
15-
file_content_buffer: String::with_capacity(buffer_size),
1614
});
1715
}
1816

@@ -21,31 +19,24 @@ impl AuthFileReader {
2119
return Ok(());
2220
}
2321

24-
pub fn read_new_lines(&mut self, mut parse_line: impl FnMut(&String)) {
25-
loop {
26-
self.file_content_buffer.clear();
27-
let bytes_read = self
28-
.reader
29-
.read_line(&mut self.file_content_buffer)
30-
.unwrap_or_else(|error| {
31-
eprintln!("Error reading file: {}", error);
32-
return 0;
33-
});
34-
if bytes_read > 0 {
35-
parse_line(&self.file_content_buffer);
36-
continue;
37-
}
38-
if !self.is_file_has_been_truncated() {
39-
break;
40-
}
22+
pub fn next_line(&mut self) -> Option<String> {
23+
let mut line = String::new();
24+
let _ = self.reader.read_line(&mut line).unwrap_or_else(|error| {
25+
eprintln!("Error reading file: {}", error);
26+
return 0;
27+
});
28+
if !line.is_empty() {
29+
return Some(line);
30+
}
31+
if self.is_file_has_been_truncated() {
4132
match self.reader.seek(SeekFrom::Start(0)) {
4233
Ok(position) => println!("Resetting position in file to {}", position),
4334
Err(error) => {
4435
eprintln!("Error resetting position in file: {}", error);
45-
break;
4636
}
4737
}
4838
}
39+
return None;
4940
}
5041

5142
fn is_file_has_been_truncated(&self) -> bool {

src/auth_file_watcher.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use crate::file_event_filter::{FileAction, FileEventFilter};
88
use crate::file_path::FilePath;
99

1010
const EVENT_BUFFER_SIZE: usize = 1024;
11-
const READER_BUFFER_SIZE: usize = 1024;
1211

1312
pub struct AuthFileWatcher {
1413
filepath: String,
@@ -48,7 +47,7 @@ impl AuthFileWatcher {
4847
}
4948

5049
fn open_file(&mut self) {
51-
let reader = match AuthFileReader::new(&self.filepath, READER_BUFFER_SIZE) {
50+
let reader = match AuthFileReader::new(&self.filepath) {
5251
Ok(reader) => reader,
5352
Err(error) => {
5453
eprintln!("Unable to open monitored file: {}", error);
@@ -70,7 +69,10 @@ impl AuthFileWatcher {
7069
self.reader = Some(reader);
7170
}
7271

73-
pub fn update(&mut self, parse_line: impl FnMut(&String)) {
72+
pub fn update<F>(&mut self, mut parse_line: F)
73+
where
74+
F: FnMut(&String),
75+
{
7476
let events = match self.inotify.read_events(&mut self.event_buffer) {
7577
Ok(events) => events,
7678
Err(error) => {
@@ -111,7 +113,9 @@ impl AuthFileWatcher {
111113
}
112114

113115
if let Some(reader) = &mut self.reader {
114-
reader.read_new_lines(parse_line);
116+
while let Some(line) = reader.next_line() {
117+
parse_line(&line);
118+
}
115119
};
116120
}
117121

0 commit comments

Comments
 (0)