| 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) |
| } |
| } |