summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-05-11 10:48:34 +0200
committerMatthias Beyer <mail@beyermatthias.de>2021-05-11 10:48:34 +0200
commit7d71ae3bf605a0c5ed38c8dfd9dc6abafbeae315 (patch)
treea7a9ab6d7d591e12e6e997822171fa4196f0ce54 /src
parent5af2d33dbb02898ff914f19a4b860cc49631bc81 (diff)
parentb3a6458ce34e3065192208826b2fc85edd4761f9 (diff)
Merge branch 'refactor-log-printing'
Diffstat (limited to 'src')
-rw-r--r--src/commands/build.rs21
-rw-r--r--src/commands/db.rs29
-rw-r--r--src/log/item.rs13
-rw-r--r--src/log/parser.rs15
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()
}
}