feat(fancy): Add option to change the link display text (#335)

This option allows to globally change the default `(link)` display text with any other text provider by users.
This commit is contained in:
David Calavera 2024-02-04 16:54:18 -08:00 committed by GitHub
parent cf2d8c0b2c
commit c7144ee513
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 34 additions and 1 deletions

View File

@ -36,6 +36,7 @@ pub struct GraphicalReportHandler {
pub(crate) word_separator: Option<textwrap::WordSeparator>,
pub(crate) word_splitter: Option<textwrap::WordSplitter>,
pub(crate) highlighter: MietteHighlighter,
pub(crate) link_display_text: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@ -62,6 +63,7 @@ impl GraphicalReportHandler {
word_separator: None,
word_splitter: None,
highlighter: MietteHighlighter::default(),
link_display_text: None,
}
}
@ -80,6 +82,7 @@ impl GraphicalReportHandler {
word_separator: None,
word_splitter: None,
highlighter: MietteHighlighter::default(),
link_display_text: None,
}
}
@ -190,6 +193,13 @@ impl GraphicalReportHandler {
self.highlighter = MietteHighlighter::nocolor();
self
}
/// Sets the display text for links.
/// Miette displays `(link)` if this option is not set.
pub fn with_link_display_text(mut self, text: impl Into<String>) -> Self {
self.link_display_text = Some(text.into());
self
}
}
impl Default for GraphicalReportHandler {
@ -246,11 +256,12 @@ impl GraphicalReportHandler {
} else {
"".to_string()
};
let display_text = self.link_display_text.as_deref().unwrap_or("(link)");
let link = format!(
"\u{1b}]8;;{}\u{1b}\\{}{}\u{1b}]8;;\u{1b}\\",
url,
code.style(severity_style),
"(link)".style(self.theme.styles.link)
display_text.style(self.theme.styles.link)
);
write!(header, "{}", link)?;
writeln!(f, "{}", header)?;

View File

@ -1341,6 +1341,28 @@ fn disable_url_links() -> Result<(), MietteError> {
Ok(())
}
#[test]
fn url_links_with_display_text() -> Result<(), MietteError> {
#[derive(Debug, Diagnostic, Error)]
#[error("oops!")]
#[diagnostic(
code(oops::my::bad),
help("try doing it better next time?"),
url("https://example.com")
)]
struct MyBad;
let err = MyBad;
let out = fmt_report_with_settings(err.into(), |handler| {
handler.with_link_display_text("Read the documentation")
});
println!("Error: {}", out);
assert!(out.contains("https://example.com"));
assert!(out.contains("Read the documentation"));
assert!(out.contains("oops::my::bad"));
Ok(())
}
#[test]
fn related() -> Result<(), MietteError> {
#[derive(Debug, Diagnostic, Error)]