diff --git a/Cargo.toml b/Cargo.toml index 914a95c..f9f83e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ once_cell = "1.8.0" owo-colors = "2.0.0" atty = "0.2.14" ci_info = "0.14.2" +textwrap = "0.14.2" [dev-dependencies] semver = "1.0.4" diff --git a/src/handlers/graphical.rs b/src/handlers/graphical.rs index 97dfc6f..fab884f 100644 --- a/src/handlers/graphical.rs +++ b/src/handlers/graphical.rs @@ -101,8 +101,13 @@ impl GraphicalReportHandler { } writeln!(f, "{}", self.theme.characters.hbar.to_string().repeat(20),)?; writeln!(f)?; - write!(f, " {} ", severity_icon.style(severity_style))?; - writeln!(f, "{}", diagnostic,)?; + // TODO: terminal width support + let initial_indent = format!(" {} ", severity_icon.style(severity_style)); + let rest_indent = format!(" {} ", self.theme.characters.vbar.style(severity_style)); + let opts = textwrap::Options::new(80) + .initial_indent(&initial_indent) + .subsequent_indent(&rest_indent); + writeln!(f, "{}", textwrap::fill(&diagnostic.to_string(), opts))?; Ok(()) } @@ -121,13 +126,19 @@ impl GraphicalReportHandler { } else { self.theme.characters.lbot }; - let prefix = format!( - " {}{}{}", + let initial_indent = format!( + " {}{}{} ", char, self.theme.characters.hbar, self.theme.characters.rarrow ) .style(severity_style) .to_string(); - writeln!(f, "{} {}", prefix, error)?; + let rest_indent = format!(" {} ", self.theme.characters.vbar) + .style(severity_style) + .to_string(); + let opts = textwrap::Options::new(80) + .initial_indent(&initial_indent) + .subsequent_indent(&rest_indent); + writeln!(f, "{}", textwrap::fill(&error.to_string(), opts))?; } } diff --git a/tests/printer.rs b/tests/printer.rs index 3747e0c..33db5fc 100644 --- a/tests/printer.rs +++ b/tests/printer.rs @@ -340,7 +340,7 @@ line5 #[test] fn multiline_highlight_no_label() -> Result<(), MietteError> { #[derive(Debug, Diagnostic, Error)] - #[error("wtf?!")] + #[error("wtf?!\nit broke :(")] #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source] @@ -355,7 +355,7 @@ fn multiline_highlight_no_label() -> Result<(), MietteError> { } #[derive(Debug, Error)] - #[error("something went wrong")] + #[error("something went wrong\n\nHere's a more detailed explanation of everything that actually went wrong because it's actually important.\n")] struct Inner(#[source] InnerInner); #[derive(Debug, Error)] @@ -379,11 +379,16 @@ line5 }; let out = fmt_report(err.into()); println!("{}", out); - let expected = r#" + let expected = " ────[oops::my::bad]──────────────────── × wtf?! + │ it broke :( ├─▶ something went wrong + │\u{20}\u{20}\u{20} + │ Here's a more detailed explanation of everything that actually went + │ wrong because it's actually important. + │\u{20}\u{20}\u{20} ╰─▶ very much went wrong ╭───[bad_file.rs:1:1] This is the part that broke: @@ -396,7 +401,7 @@ line5 ╰─── ‽ try doing it better next time? -"# +" .trim_start() .to_string(); assert_eq!(expected, out);