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
72
73
74
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())
}
}