mirror of https://github.com/zkat/miette.git
72 lines
2.4 KiB
Rust
72 lines
2.4 KiB
Rust
use std::fmt;
|
|
|
|
use crate::{protocol::Diagnostic, ReportHandler};
|
|
|
|
/**
|
|
[`ReportHandler`] that renders plain text and avoids extraneous graphics.
|
|
It's optimized for screen readers and braille users, but is also used in any
|
|
non-graphical environments, such as non-TTY output.
|
|
*/
|
|
#[derive(Debug, Clone)]
|
|
pub struct DebugReportHandler;
|
|
|
|
impl DebugReportHandler {
|
|
/// Create a new [`NarratableReportHandler`](crate::NarratableReportHandler)
|
|
/// There are no customization options.
|
|
pub const fn new() -> Self {
|
|
Self
|
|
}
|
|
}
|
|
|
|
impl Default for DebugReportHandler {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|
|
|
|
impl DebugReportHandler {
|
|
/// Render a [`Diagnostic`]. This function is mostly internal and meant to
|
|
/// be called by the toplevel [`ReportHandler`] handler, but is made public
|
|
/// to make it easier (possible) to test in isolation from global state.
|
|
pub fn render_report(
|
|
&self,
|
|
f: &mut fmt::Formatter<'_>,
|
|
diagnostic: &(dyn Diagnostic),
|
|
) -> fmt::Result {
|
|
let mut diag = f.debug_struct("Diagnostic");
|
|
diag.field("message", &format!("{}", diagnostic));
|
|
if let Some(code) = diagnostic.code() {
|
|
diag.field("code", &code.to_string());
|
|
}
|
|
if let Some(severity) = diagnostic.severity() {
|
|
diag.field("severity", &format!("{:?}", severity));
|
|
}
|
|
if let Some(url) = diagnostic.url() {
|
|
diag.field("url", &url.to_string());
|
|
}
|
|
if let Some(help) = diagnostic.help() {
|
|
diag.field("help", &help.to_string());
|
|
}
|
|
if let Some(labels) = diagnostic.labels() {
|
|
let labels: Vec<_> = labels.collect();
|
|
diag.field("labels", &format!("{:?}", labels));
|
|
}
|
|
if let Some(cause) = diagnostic.diagnostic_source() {
|
|
diag.field("caused by", &format!("{:?}", cause));
|
|
}
|
|
diag.finish()?;
|
|
writeln!(f)?;
|
|
writeln!(f, "NOTE: If you're looking for the fancy error reports, install miette with the `fancy` feature, or write your own and hook it up with miette::set_hook().")
|
|
}
|
|
}
|
|
|
|
impl ReportHandler for DebugReportHandler {
|
|
fn debug(&self, diagnostic: &(dyn Diagnostic), f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
if f.alternate() {
|
|
return fmt::Debug::fmt(diagnostic, f);
|
|
}
|
|
|
|
self.render_report(f, diagnostic)
|
|
}
|
|
}
|