mirror of https://github.com/zkat/miette.git
feat(graphical): Allow miette users to opt-out of the rendering of the cause chain (#192)
Fixes: https://github.com/zkat/miette/issues/191
This commit is contained in:
parent
c3e6c98336
commit
b9ea587159
|
|
@ -56,6 +56,7 @@ pub struct MietteHandlerOpts {
|
||||||
pub(crate) footer: Option<String>,
|
pub(crate) footer: Option<String>,
|
||||||
pub(crate) context_lines: Option<usize>,
|
pub(crate) context_lines: Option<usize>,
|
||||||
pub(crate) tab_width: Option<usize>,
|
pub(crate) tab_width: Option<usize>,
|
||||||
|
pub(crate) with_cause_chain: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MietteHandlerOpts {
|
impl MietteHandlerOpts {
|
||||||
|
|
@ -87,6 +88,18 @@ impl MietteHandlerOpts {
|
||||||
self
|
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
|
/// If true, colors will be used during graphical rendering, regardless
|
||||||
/// of whether or not the terminal supports them.
|
/// of whether or not the terminal supports them.
|
||||||
///
|
///
|
||||||
|
|
@ -165,6 +178,13 @@ impl MietteHandlerOpts {
|
||||||
if let Some(context_lines) = self.context_lines {
|
if let Some(context_lines) = self.context_lines {
|
||||||
handler = handler.with_context_lines(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 {
|
MietteHandler {
|
||||||
inner: Box::new(handler),
|
inner: Box::new(handler),
|
||||||
}
|
}
|
||||||
|
|
@ -197,6 +217,13 @@ impl MietteHandlerOpts {
|
||||||
.with_width(width)
|
.with_width(width)
|
||||||
.with_links(linkify)
|
.with_links(linkify)
|
||||||
.with_theme(theme);
|
.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 {
|
if let Some(footer) = self.footer {
|
||||||
handler = handler.with_footer(footer);
|
handler = handler.with_footer(footer);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ pub struct GraphicalReportHandler {
|
||||||
pub(crate) footer: Option<String>,
|
pub(crate) footer: Option<String>,
|
||||||
pub(crate) context_lines: usize,
|
pub(crate) context_lines: usize,
|
||||||
pub(crate) tab_width: Option<usize>,
|
pub(crate) tab_width: Option<usize>,
|
||||||
|
pub(crate) with_cause_chain: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
|
@ -48,6 +49,7 @@ impl GraphicalReportHandler {
|
||||||
footer: None,
|
footer: None,
|
||||||
context_lines: 1,
|
context_lines: 1,
|
||||||
tab_width: None,
|
tab_width: None,
|
||||||
|
with_cause_chain: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,6 +62,7 @@ impl GraphicalReportHandler {
|
||||||
footer: None,
|
footer: None,
|
||||||
context_lines: 1,
|
context_lines: 1,
|
||||||
tab_width: None,
|
tab_width: None,
|
||||||
|
with_cause_chain: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -79,6 +82,20 @@ impl GraphicalReportHandler {
|
||||||
self
|
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.
|
/// Whether to include [`Diagnostic::url()`] in the output.
|
||||||
///
|
///
|
||||||
/// Disabling this is not recommended, but can be useful for more easily
|
/// Disabling this is not recommended, but can be useful for more easily
|
||||||
|
|
@ -199,6 +216,10 @@ impl GraphicalReportHandler {
|
||||||
|
|
||||||
writeln!(f, "{}", textwrap::fill(&diagnostic.to_string(), opts))?;
|
writeln!(f, "{}", textwrap::fill(&diagnostic.to_string(), opts))?;
|
||||||
|
|
||||||
|
if !self.with_cause_chain {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(mut cause_iter) = diagnostic
|
if let Some(mut cause_iter) = diagnostic
|
||||||
.diagnostic_source()
|
.diagnostic_source()
|
||||||
.map(DiagnosticChain::from_diagnostic)
|
.map(DiagnosticChain::from_diagnostic)
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ non-graphical environments, such as non-TTY output.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct NarratableReportHandler {
|
pub struct NarratableReportHandler {
|
||||||
context_lines: usize,
|
context_lines: usize,
|
||||||
|
with_cause_chain: bool,
|
||||||
footer: Option<String>,
|
footer: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -24,9 +25,23 @@ impl NarratableReportHandler {
|
||||||
Self {
|
Self {
|
||||||
footer: None,
|
footer: None,
|
||||||
context_lines: 1,
|
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.
|
/// Set the footer to be displayed at the end of the report.
|
||||||
pub fn with_footer(mut self, footer: String) -> Self {
|
pub fn with_footer(mut self, footer: String) -> Self {
|
||||||
self.footer = Some(footer);
|
self.footer = Some(footer);
|
||||||
|
|
@ -57,7 +72,9 @@ impl NarratableReportHandler {
|
||||||
diagnostic: &(dyn Diagnostic),
|
diagnostic: &(dyn Diagnostic),
|
||||||
) -> fmt::Result {
|
) -> fmt::Result {
|
||||||
self.render_header(f, diagnostic)?;
|
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();
|
let src = diagnostic.source_code();
|
||||||
self.render_snippets(f, diagnostic, src)?;
|
self.render_snippets(f, diagnostic, src)?;
|
||||||
self.render_footer(f, diagnostic)?;
|
self.render_footer(f, diagnostic)?;
|
||||||
|
|
|
||||||
17
src/lib.rs
17
src/lib.rs
|
|
@ -582,15 +582,14 @@
|
||||||
//! `miette` was not developed in a void. It owes enormous credit to various
|
//! `miette` was not developed in a void. It owes enormous credit to various
|
||||||
//! other projects and their authors:
|
//! other projects and their authors:
|
||||||
//!
|
//!
|
||||||
//! - [`anyhow`](http://crates.io/crates/anyhow) and
|
//! - [`anyhow`](http://crates.io/crates/anyhow) and [`color-eyre`](https://crates.io/crates/color-eyre):
|
||||||
//! [`color-eyre`](https://crates.io/crates/color-eyre): these two
|
//! these two enormously influential error handling libraries have pushed
|
||||||
//! enormously influential error handling libraries have pushed forward the
|
//! forward the experience of application-level error handling and error
|
||||||
//! experience of application-level error handling and error reporting.
|
//! reporting. `miette`'s `Report` type is an attempt at a very very rough
|
||||||
//! `miette`'s `Report` type is an attempt at a very very rough version of
|
//! version of their `Report` types.
|
||||||
//! their `Report` types.
|
//! - [`thiserror`](https://crates.io/crates/thiserror) for setting the standard
|
||||||
//! - [`thiserror`](https://crates.io/crates/thiserror) for setting the
|
//! for library-level error definitions, and for being the inspiration behind
|
||||||
//! standard for library-level error definitions, and for being the
|
//! `miette`'s derive macro.
|
||||||
//! inspiration behind `miette`'s derive macro.
|
|
||||||
//! - `rustc` and [@estebank](https://github.com/estebank) for their
|
//! - `rustc` and [@estebank](https://github.com/estebank) for their
|
||||||
//! state-of-the-art work in compiler diagnostics.
|
//! state-of-the-art work in compiler diagnostics.
|
||||||
//! - [`ariadne`](https://crates.io/crates/ariadne) for pushing forward how
|
//! - [`ariadne`](https://crates.io/crates/ariadne) for pushing forward how
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue