From 7645a9460f68b4e039aaed963731bcf8cbc86426 Mon Sep 17 00:00:00 2001 From: KtorZ Date: Sat, 25 Nov 2023 14:49:56 +0100 Subject: [PATCH] Display error codes better. This is a *slight* hack / abuse of the code() method as we are now doing a bit of formatting within that function. Yet, we only do so at the very top-level (i.e. project's Error) because we can't actually fiddle with how miette presents errors. --- crates/aiken-project/src/error.rs | 54 +++++++++++++++++++++--------- crates/aiken-project/src/script.rs | 2 +- crates/aiken-project/src/watch.rs | 12 ++++--- 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/crates/aiken-project/src/error.rs b/crates/aiken-project/src/error.rs index cc0620bb..f75947fc 100644 --- a/crates/aiken-project/src/error.rs +++ b/crates/aiken-project/src/error.rs @@ -262,31 +262,45 @@ impl Diagnostic for Error { } fn code<'a>(&'a self) -> Option> { + fn boxed<'a>(s: Box) -> Box { + Box::new(format!( + " {} {}", + "Error" + .if_supports_color(Stdout, |s| s.red()) + .if_supports_color(Stdout, |s| s.bold()), + format!("{s}").if_supports_color(Stdout, |s| s.red()) + )) + } + match self { - Error::DuplicateModule { .. } => Some(Box::new("aiken::module::duplicate")), + Error::DuplicateModule { .. } => Some(boxed(Box::new("aiken::module::duplicate"))), Error::FileIo { .. } => None, - Error::Blueprint(e) => e.code(), - Error::ImportCycle { .. } => Some(Box::new("aiken::module::cyclical")), - Error::Parse { .. } => Some(Box::new("aiken::parser")), - Error::Type { error, .. } => Some(Box::new(format!( + Error::Blueprint(e) => e.code().map(boxed), + Error::ImportCycle { .. } => Some(boxed(Box::new("aiken::module::cyclical"))), + Error::Parse { .. } => Some(boxed(Box::new("aiken::parser"))), + Error::Type { error, .. } => Some(boxed(Box::new(format!( "aiken::check{}", error.code().map(|s| format!("::{s}")).unwrap_or_default() - ))), + )))), Error::StandardIo(_) => None, Error::MissingManifest { .. } => None, - Error::TomlLoading { .. } => Some(Box::new("aiken::loading::toml")), + Error::TomlLoading { .. } => Some(boxed(Box::new("aiken::loading::toml"))), Error::Format { .. } => None, - Error::TestFailure { path, .. } => Some(Box::new(path.to_str().unwrap_or(""))), + Error::TestFailure { path, .. } => Some(boxed(Box::new(path.to_str().unwrap_or("")))), Error::Http(_) => Some(Box::new("aiken::packages::download")), Error::ZipExtract(_) => None, Error::JoinError(_) => None, - Error::UnknownPackageVersion { .. } => Some(Box::new("aiken::packages::resolve")), - Error::UnableToResolvePackage { .. } => Some(Box::new("aiken::package::download")), + Error::UnknownPackageVersion { .. } => { + Some(boxed(Box::new("aiken::packages::resolve"))) + } + Error::UnableToResolvePackage { .. } => { + Some(boxed(Box::new("aiken::package::download"))) + } Error::Json { .. } => None, Error::MalformedStakeAddress { .. } => None, Error::NoValidatorNotFound { .. } => None, Error::MoreThanOneValidatorFound { .. } => None, - Error::Module(e) => e.code(), + Error::Module(e) => e.code().map(boxed), } } @@ -532,14 +546,24 @@ impl Diagnostic for Warning { } fn code<'a>(&'a self) -> Option> { + fn boxed<'a>(s: Box) -> Box { + Box::new(format!( + " {} {}", + "Warning" + .if_supports_color(Stdout, |s| s.yellow()) + .if_supports_color(Stdout, |s| s.bold()), + format!("{s}").if_supports_color(Stdout, |s| s.yellow()) + )) + } + match self { - Warning::Type { warning, .. } => Some(Box::new(format!( + Warning::Type { warning, .. } => Some(boxed(Box::new(format!( "aiken::check{}", warning.code().map(|s| format!("::{s}")).unwrap_or_default() - ))), - Warning::NoValidators => Some(Box::new("aiken::check")), + )))), + Warning::NoValidators => Some(boxed(Box::new("aiken::check"))), Warning::DependencyAlreadyExists { .. } => { - Some(Box::new("aiken::packages::already_exists")) + Some(boxed(Box::new("aiken::packages::already_exists"))) } } } diff --git a/crates/aiken-project/src/script.rs b/crates/aiken-project/src/script.rs index ce3fc636..9aa4d28d 100644 --- a/crates/aiken-project/src/script.rs +++ b/crates/aiken-project/src/script.rs @@ -81,7 +81,7 @@ impl Display for EvalHint { )), _ => None, } - .ok_or(fmt::Error::default())?; + .ok_or(fmt::Error)?; f.write_str(&msg) } diff --git a/crates/aiken-project/src/watch.rs b/crates/aiken-project/src/watch.rs index f3709ca5..99934ff8 100644 --- a/crates/aiken-project/src/watch.rs +++ b/crates/aiken-project/src/watch.rs @@ -31,7 +31,7 @@ struct Summary { impl Display for Summary { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.write_str(&format!( - "{}\n {} {}, {} {}", + " {} {} {}, {} {}", "Summary" .if_supports_color(Stderr, |s| s.purple()) .if_supports_color(Stderr, |s| s.bold()), @@ -41,14 +41,16 @@ impl Display for Summary { } else { "errors" } - .if_supports_color(Stderr, |s| s.red()), + .if_supports_color(Stderr, |s| s.red()) + .if_supports_color(Stderr, |s| s.bold()), self.warning_count, if self.warning_count == 1 { "warning" } else { "warnings" } - .if_supports_color(Stderr, |s| s.yellow()), + .if_supports_color(Stderr, |s| s.yellow()) + .if_supports_color(Stderr, |s| s.bold()), )) } } @@ -107,7 +109,7 @@ where } eprintln!( - "\n{}", + "{}", Summary { warning_count, error_count: errs.len(), @@ -117,7 +119,7 @@ where return Err(ExitFailure::into_report()); } else { eprintln!( - "\n{}", + "{}", Summary { error_count: 0, warning_count