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.
This commit is contained in:
KtorZ 2023-11-25 14:49:56 +01:00
parent 6c039708c3
commit 7645a9460f
No known key found for this signature in database
GPG Key ID: 33173CB6F77F4277
3 changed files with 47 additions and 21 deletions

View File

@ -262,31 +262,45 @@ impl Diagnostic for Error {
}
fn code<'a>(&'a self) -> Option<Box<dyn Display + 'a>> {
fn boxed<'a>(s: Box<dyn Display + 'a>) -> Box<dyn Display + 'a> {
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<Box<dyn Display + 'a>> {
fn boxed<'a>(s: Box<dyn Display + 'a>) -> Box<dyn Display + 'a> {
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")))
}
}
}

View File

@ -81,7 +81,7 @@ impl Display for EvalHint {
)),
_ => None,
}
.ok_or(fmt::Error::default())?;
.ok_or(fmt::Error)?;
f.write_str(&msg)
}

View File

@ -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