summaryrefslogtreecommitdiffstats
path: root/src/log
diff options
context:
space:
mode:
Diffstat (limited to 'src/log')
-rw-r--r--src/log/parser.rs45
1 files changed, 25 insertions, 20 deletions
diff --git a/src/log/parser.rs b/src/log/parser.rs
index 00b0bea..6163bc8 100644
--- a/src/log/parser.rs
+++ b/src/log/parser.rs
@@ -25,26 +25,31 @@ pub fn buffer_stream_to_line_stream<S>(stream: S) -> impl Stream<Item = IoResult
.lines()
}
-pub fn log_is_successfull(log: &str) -> Result<Option<bool>> {
-
- let p = parser();
- let i = log.lines()
- .map(|line| p.parse(line.as_bytes()).map_err(Error::from))
- .filter_ok(|line| match line {
- LogItem::State(_) => true,
- _ => false,
- })
- .collect::<Result<Vec<_>>>()?;
-
- Ok({ i.into_iter()
- .rev()
- .next()
- .and_then(|ll| match ll {
- LogItem::State(Ok(_)) => Some(true),
- LogItem::State(Err(_)) => Some(false),
- _ => None,
- })
- })
+pub struct ParsedLog(Vec<LogItem>);
+
+impl ParsedLog {
+ pub fn build_from(s: &str) -> Result<Self> {
+ let p = parser();
+ s.lines()
+ .map(|line| p.parse(line.as_bytes()).map_err(Error::from))
+ .collect::<Result<Vec<_>>>()
+ .map(ParsedLog)
+ }
+
+ pub fn is_successfull(&self) -> Option<bool> {
+ self.0.iter()
+ .rev()
+ .filter_map(|line| match line {
+ LogItem::State(Ok(_)) => Some(true),
+ LogItem::State(Err(_)) => Some(false),
+ _ => None,
+ })
+ .next()
+ }
+
+ pub fn iter(&self) -> impl Iterator<Item = &LogItem> {
+ self.0.iter()
+ }
}
pub fn parser<'a>() -> PomParser<'a, u8, LogItem> {