1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
use std::io::{self, BufRead, BufReader, Read}; #[derive(Debug)] pub enum WaitError { EndOfStream, IO(io::Error), } impl From<io::Error> for WaitError { fn from(e: io::Error) -> Self { WaitError::IO(e) } } pub trait WaitForMessage { fn wait_for_message(self, message: &str) -> Result<(), WaitError>; } impl<T> WaitForMessage for T where T: Read, { fn wait_for_message(self, message: &str) -> Result<(), WaitError> { let logs = BufReader::new(self); let mut iter = logs.lines().into_iter(); let mut number_of_compared_lines = 0; while let Some(line) = iter.next() { let line = line?; number_of_compared_lines += 1; if line.contains(message) { info!( "Found message after comparing {} lines", number_of_compared_lines ); return Ok(()); } } error!( "Failed to find message in stream after comparing {} lines.", number_of_compared_lines ); Err(WaitError::EndOfStream) } } #[cfg(test)] mod tests { use super::*; #[test] fn given_logs_when_line_contains_message_should_find_it() { let logs = r" Message one Message two Message three ".as_bytes(); let result = logs.wait_for_message("Message three"); assert!(result.is_ok()) } }