diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-05-11 10:48:34 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-05-11 10:48:34 +0200 |
commit | 7d71ae3bf605a0c5ed38c8dfd9dc6abafbeae315 (patch) | |
tree | a7a9ab6d7d591e12e6e997822171fa4196f0ce54 /src | |
parent | 5af2d33dbb02898ff914f19a4b860cc49631bc81 (diff) | |
parent | b3a6458ce34e3065192208826b2fc85edd4761f9 (diff) |
Merge branch 'refactor-log-printing'
Diffstat (limited to 'src')
-rw-r--r-- | src/commands/build.rs | 21 | ||||
-rw-r--r-- | src/commands/db.rs | 29 | ||||
-rw-r--r-- | src/log/item.rs | 13 | ||||
-rw-r--r-- | src/log/parser.rs | 15 |
4 files changed, 33 insertions, 45 deletions
diff --git a/src/commands/build.rs b/src/commands/build.rs index 07d2ce8..df4b672 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -11,6 +11,7 @@ use std::io::Write; use std::path::Path; use std::path::PathBuf; +use std::str::FromStr; use std::sync::Arc; use anyhow::anyhow; @@ -407,25 +408,23 @@ pub async fn build( data.1.version.to_string().red() )?; - let parsed_log = crate::log::ParsedLog::build_from(&data.0.log_text)?; let mut last_phase = None; let mut error_catched = false; - let lines = parsed_log - .iter() - .map(|line_item| match line_item { - LogItem::Line(s) => Ok(String::from_utf8(s.to_vec())?.normal()), - LogItem::Progress(u) => Ok(format!("#BUTIDO:PROGRESS:{}", u).bright_black()), - LogItem::CurrentPhase(p) => { + let lines = crate::log::ParsedLog::from_str(&data.0.log_text)? + .into_iter() + .map(|line_item| { + if let LogItem::CurrentPhase(ref p) = line_item { if !error_catched { last_phase = Some(p.clone()); } - Ok(format!("#BUTIDO:PHASE:{}", p).bright_black()) } - LogItem::State(Ok(())) => Ok("#BUTIDO:STATE:OK".to_string().green()), - LogItem::State(Err(s)) => { + + if let LogItem::State(_) = line_item { error_catched = true; - Ok(format!("#BUTIDO:STATE:ERR:{}", s).red()) } + + + line_item.display().map(|d| d.to_string()) }) .collect::<Result<Vec<_>>>()?; diff --git a/src/commands/db.rs b/src/commands/db.rs index c3a3eb1..896caa1 100644 --- a/src/commands/db.rs +++ b/src/commands/db.rs @@ -27,12 +27,10 @@ use diesel::RunQueryDsl; use itertools::Itertools; use log::debug; use log::info; -use resiter::AndThen; use crate::config::Configuration; use crate::db::models; use crate::db::DbConnectionConfig; -use crate::log::LogItem; use crate::package::Script; use crate::schema; @@ -487,7 +485,7 @@ fn job(conn_cfg: DbConnectionConfig, config: &Configuration, matches: &ArgMatche models::Image, )>(&conn)?; - let parsed_log = crate::log::ParsedLog::build_from(&data.0.log_text)?; + let parsed_log = crate::log::ParsedLog::from_str(&data.0.log_text)?; let success = parsed_log.is_successfull(); if csv { @@ -607,14 +605,8 @@ fn job(conn_cfg: DbConnectionConfig, config: &Configuration, matches: &ArgMatche if show_log { let log = parsed_log - .iter() - .map(|line_item| match line_item { - LogItem::Line(s) => Ok(String::from_utf8(s.to_vec())?.normal()), - LogItem::Progress(u) => Ok(format!("#BUTIDO:PROGRESS:{}", u).bright_black()), - LogItem::CurrentPhase(p) => Ok(format!("#BUTIDO:PHASE:{}", p).bright_black()), - LogItem::State(Ok(())) => Ok("#BUTIDO:STATE:OK".to_string().green()), - LogItem::State(Err(s)) => Ok(format!("#BUTIDO:STATE:ERR:{}", s).red()), - }) + .into_iter() + .map(|line_item| line_item.display().map(|d| d.to_string())) .collect::<Result<Vec<_>>>()? .into_iter() // ugly, but hey... not important right now. .join("\n"); @@ -651,16 +643,9 @@ fn log_of(conn_cfg: DbConnectionConfig, matches: &ArgMatches) -> Result<()> { .select(schema::jobs::dsl::log_text) .first::<String>(&conn) .map_err(Error::from) - .and_then(crate::log::ParsedLog::build_from)? - .iter() - .map(|line_item| match line_item { - LogItem::Line(s) => Ok(String::from_utf8(s.to_vec())?.normal()), - LogItem::Progress(u) => Ok(format!("#BUTIDO:PROGRESS:{}", u).bright_black()), - LogItem::CurrentPhase(p) => Ok(format!("#BUTIDO:PHASE:{}", p).bright_black()), - LogItem::State(Ok(())) => Ok("#BUTIDO:STATE:OK".to_string().green()), - LogItem::State(Err(s)) => Ok(format!("#BUTIDO:STATE:ERR:{}", s).red()), - }) - .and_then_ok(|line| writeln!(lock, "{}", line).map_err(Error::from)) + .and_then(|s| crate::log::ParsedLog::from_str(&s))? + .into_iter() + .map(|line| line.display().and_then(|d| writeln!(lock, "{}", d).map_err(Error::from))) .collect::<Result<Vec<()>>>() .map(|_| ()) } @@ -712,6 +697,6 @@ fn releases(conn_cfg: DbConnectionConfig, config: &Configuration, matches: &ArgM /// /// Returns Ok(None) if cannot be decided fn is_job_successful(job: &models::Job) -> Result<Option<bool>> { - crate::log::ParsedLog::build_from(&job.log_text).map(|pl| pl.is_successfull()) + crate::log::ParsedLog::from_str(&job.log_text).map(|pl| pl.is_successfull()) } diff --git a/src/log/item.rs b/src/log/item.rs index 9518479..2887841 100644 --- a/src/log/item.rs +++ b/src/log/item.rs @@ -9,6 +9,7 @@ // use anyhow::Result; +use colored::Colorize; #[derive(Debug, PartialEq, Eq, Hash)] pub enum LogItem { @@ -29,15 +30,15 @@ pub enum LogItem { impl LogItem { pub fn display(&self) -> Result<Display> { match self { - LogItem::Line(s) => Ok(Display(String::from_utf8(s.to_vec())?)), - LogItem::Progress(u) => Ok(Display(format!("#BUTIDO:PROGRESS:{}", u))), - LogItem::CurrentPhase(p) => Ok(Display(format!("#BUTIDO:PHASE:{}", p))), - LogItem::State(Ok(())) => Ok(Display("#BUTIDO:STATE:OK".to_string())), - LogItem::State(Err(s)) => Ok(Display(format!("#BUTIDO:STATE:ERR:{}", s))), + LogItem::Line(s) => Ok(Display(String::from_utf8(s.to_vec())?.normal())), + LogItem::Progress(u) => Ok(Display(format!("#BUTIDO:PROGRESS:{}", u).cyan())), + LogItem::CurrentPhase(p) => Ok(Display(format!("#BUTIDO:PHASE:{}", p).cyan())), + LogItem::State(Ok(())) => Ok(Display("#BUTIDO:STATE:OK".to_string().green())), + LogItem::State(Err(s)) => Ok(Display(format!("#BUTIDO:STATE:ERR:{}", s).red())), } } } #[derive(parse_display::Display)] #[display("{0}")] -pub struct Display(String); +pub struct Display(colored::ColoredString); diff --git a/src/log/parser.rs b/src/log/parser.rs index 6dcb9e3..f83bdfb 100644 --- a/src/log/parser.rs +++ b/src/log/parser.rs @@ -38,16 +38,19 @@ where pub struct ParsedLog(Vec<LogItem>); -impl ParsedLog { - pub fn build_from<S: AsRef<str>>(s: S) -> Result<Self> { +impl FromStr for ParsedLog { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result<Self> { let p = parser(); - s.as_ref() - .lines() + s.lines() .map(|line| p.parse(line.as_bytes()).map_err(Error::from)) .collect::<Result<Vec<_>>>() .map(ParsedLog) } +} +impl ParsedLog { pub fn is_successfull(&self) -> Option<bool> { self.0 .iter() @@ -60,8 +63,8 @@ impl ParsedLog { .next() } - pub fn iter(&self) -> impl Iterator<Item = &LogItem> { - self.0.iter() + pub fn into_iter(self) -> impl Iterator<Item = LogItem> { + self.0.into_iter() } } |