diff --git a/src/read/times.rs b/src/read/times.rs index 24dfa35..9c5b487 100644 --- a/src/read/times.rs +++ b/src/read/times.rs @@ -30,49 +30,28 @@ impl TimeReader { } _ => return vec, }; - let parser = match &self.ts_format { - Some(ts_format) => match LogDateParser::new_with_format(&first_line, &ts_format) { - Ok(p) => p, - Err(error) => { - error!("Could not figure out parsing strategy: {}", error); - return vec; - } - }, - None => match LogDateParser::new_with_guess(&first_line) { - Ok(p) => p, - Err(error) => { - error!("Could not figure out parsing strategy: {}", error); - return vec; - } - }, + let parser = match self.build_parser(&first_line) { + Ok(p) => p, + Err(error) => { + error!("Could not figure out parsing strategy: {}", error); + return vec; + } }; + let mut cut_datetime: Option> = None; if let Ok(x) = parser.parse(&first_line) { - vec.push(x); - } - let cut_datetime = match self.duration { - Some(duration) => { - if !self.early_stop || vec.is_empty() { - None - } else { - Some(vec[0] + duration) + if self.early_stop { + if let Some(duration) = self.duration { + cut_datetime = Some(x + duration) } } - _ => None, - }; + self.push_conditionally(x, &mut vec, &first_line, None); + } for line in iterator { match line { Ok(string) => { if let Ok(x) = parser.parse(&string) { - match cut_datetime { - Some(d) if x > d => break, - _ => (), - }; - if let Some(re) = &self.regex { - if re.is_match(&string) { - vec.push(x); - } - } else { - vec.push(x); + if self.push_conditionally(x, &mut vec, &string, cut_datetime) { + break; } } } @@ -89,6 +68,35 @@ impl TimeReader { } vec } + + fn build_parser(&self, line: &str) -> Result { + match &self.ts_format { + Some(ts_format) => LogDateParser::new_with_format(&line, &ts_format), + None => LogDateParser::new_with_guess(&line), + } + } + + fn push_conditionally( + &self, + d: DateTime, + vec: &mut Vec>, + line: &str, + cut_datetime: Option>, + ) -> bool { + if let Some(cut) = cut_datetime { + if cut < d { + return self.early_stop; + } + } + if let Some(re) = &self.regex { + if re.is_match(&line) { + vec.push(d); + } + } else { + vec.push(d); + }; + false + } } #[cfg(test)]