diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-11-13 11:30:49 +0100 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-11-13 11:30:49 +0100 |
commit | 301e48fac22c1c73201610ef07ff29cf2647c824 (patch) | |
tree | a54efa7ea9829e42ebf81f58effde166dc64b476 /src/log/parser.rs | |
parent | 5f2c600fded421b57ebf44558f8d5dffe8e5580e (diff) |
Add helper to check whether a log text reports success
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/log/parser.rs')
-rw-r--r-- | src/log/parser.rs | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/log/parser.rs b/src/log/parser.rs index f95cc1c..00b0bea 100644 --- a/src/log/parser.rs +++ b/src/log/parser.rs @@ -1,11 +1,14 @@ use std::result::Result as RResult; use std::str::FromStr; +use anyhow::Error; +use anyhow::Result; use futures::AsyncBufReadExt; use futures::Stream; use futures::StreamExt; use futures::TryStreamExt; use pom::parser::Parser as PomParser; +use resiter::Filter; use shiplift::tty::TtyChunk; use crate::log::LogItem; @@ -22,6 +25,28 @@ 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 fn parser<'a>() -> PomParser<'a, u8, LogItem> { use pom::parser::*; |