From f99a7b786df6c0ce603218752f1738f4e7d9d607 Mon Sep 17 00:00:00 2001 From: Luca Palmieri Date: Sun, 7 Aug 2022 15:01:40 +0100 Subject: [PATCH] Allow miette users to opt-out of the rendering of the cause chain --- src/handler.rs | 27 +++++++++++++++++++++++++++ src/handlers/graphical.rs | 19 ++++++++++++++++++- src/handlers/narratable.rs | 18 +++++++++++++++++- 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/handler.rs b/src/handler.rs index a6e20da..bd55ef2 100644 --- a/src/handler.rs +++ b/src/handler.rs @@ -56,6 +56,7 @@ pub struct MietteHandlerOpts { pub(crate) footer: Option, pub(crate) context_lines: Option, pub(crate) tab_width: Option, + pub(crate) with_cause_chain: Option } impl MietteHandlerOpts { @@ -86,6 +87,18 @@ impl MietteHandlerOpts { self.width = Some(width); self } + + /// Include the cause chain of the top-level error in the report. + pub fn with_cause_chain(mut self) -> Self { + self.with_cause_chain = Some(true); + self + } + + /// Do not include the cause chain of the top-level error in the report. + pub fn without_cause_chain(mut self) -> Self { + self.with_cause_chain = Some(false); + self + } /// If true, colors will be used during graphical rendering, regardless /// of whether or not the terminal supports them. @@ -165,6 +178,13 @@ impl MietteHandlerOpts { if let Some(context_lines) = self.context_lines { handler = handler.with_context_lines(context_lines); } + if let Some(with_cause_chain) = self.with_cause_chain { + if with_cause_chain { + handler = handler.with_cause_chain(); + } else { + handler = handler.without_cause_chain(); + } + } MietteHandler { inner: Box::new(handler), } @@ -197,6 +217,13 @@ impl MietteHandlerOpts { .with_width(width) .with_links(linkify) .with_theme(theme); + if let Some(with_cause_chain) = self.with_cause_chain { + if with_cause_chain { + handler = handler.with_cause_chain(); + } else { + handler = handler.without_cause_chain(); + } + } if let Some(footer) = self.footer { handler = handler.with_footer(footer); } diff --git a/src/handlers/graphical.rs b/src/handlers/graphical.rs index 765a1d2..be3d2d0 100644 --- a/src/handlers/graphical.rs +++ b/src/handlers/graphical.rs @@ -28,6 +28,7 @@ pub struct GraphicalReportHandler { pub(crate) footer: Option, pub(crate) context_lines: usize, pub(crate) tab_width: Option, + pub(crate) with_cause_chain: bool } #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -48,6 +49,7 @@ impl GraphicalReportHandler { footer: None, context_lines: 1, tab_width: None, + with_cause_chain: true } } @@ -60,6 +62,7 @@ impl GraphicalReportHandler { footer: None, context_lines: 1, tab_width: None, + with_cause_chain: true } } @@ -78,6 +81,18 @@ impl GraphicalReportHandler { }; self } + + /// Include the cause chain of the top-level error in the graphical output, if available. + pub fn with_cause_chain(mut self) -> Self { + self.with_cause_chain = true; + self + } + + /// Do not include the cause chain of the top-level error in the graphical output. + pub fn without_cause_chain(mut self) -> Self { + self.with_cause_chain = false; + self + } /// Whether to include [`Diagnostic::url()`] in the output. /// @@ -134,7 +149,9 @@ impl GraphicalReportHandler { ) -> fmt::Result { self.render_header(f, diagnostic)?; writeln!(f)?; - self.render_causes(f, diagnostic)?; + if self.with_cause_chain { + self.render_causes(f, diagnostic)?; + } let src = diagnostic.source_code(); self.render_snippets(f, diagnostic, src)?; self.render_footer(f, diagnostic)?; diff --git a/src/handlers/narratable.rs b/src/handlers/narratable.rs index 5ff3ae9..b2d6a39 100644 --- a/src/handlers/narratable.rs +++ b/src/handlers/narratable.rs @@ -14,6 +14,7 @@ non-graphical environments, such as non-TTY output. #[derive(Debug, Clone)] pub struct NarratableReportHandler { context_lines: usize, + with_cause_chain: bool, footer: Option, } @@ -24,8 +25,21 @@ impl NarratableReportHandler { Self { footer: None, context_lines: 1, + with_cause_chain: true } } + + /// Include the cause chain of the top-level error in the report, if available. + pub fn with_cause_chain(mut self) -> Self { + self.with_cause_chain = true; + self + } + + /// Do not include the cause chain of the top-level error in the report. + pub fn without_cause_chain(mut self) -> Self { + self.with_cause_chain = false; + self + } /// Set the footer to be displayed at the end of the report. pub fn with_footer(mut self, footer: String) -> Self { @@ -57,7 +71,9 @@ impl NarratableReportHandler { diagnostic: &(dyn Diagnostic), ) -> fmt::Result { self.render_header(f, diagnostic)?; - self.render_causes(f, diagnostic)?; + if self.with_cause_chain { + self.render_causes(f, diagnostic)?; + } let src = diagnostic.source_code(); self.render_snippets(f, diagnostic, src)?; self.render_footer(f, diagnostic)?;