feat(json): causes support

This commit is contained in:
Leon Breedt 2022-07-31 14:38:33 +12:00
parent e286c705fd
commit f2ee17ffb9
2 changed files with 45 additions and 2 deletions

View File

@ -1,6 +1,8 @@
use std::fmt::{self, Write};
use crate::{protocol::Diagnostic, ReportHandler, Severity, SourceCode};
use crate::{
diagnostic_chain::DiagnosticChain, protocol::Diagnostic, ReportHandler, Severity, SourceCode,
};
/**
[`ReportHandler`] that renders JSON output. It's a machine-readable output.
@ -79,6 +81,25 @@ impl JSONReportHandler {
Some(Severity::Advice) => "advice",
};
write!(f, r#""severity": "{:}","#, severity)?;
if let Some(cause_iter) = diagnostic
.diagnostic_source()
.map(DiagnosticChain::from_diagnostic)
.or_else(|| diagnostic.source().map(DiagnosticChain::from_stderror))
{
write!(f, r#""causes": ["#)?;
let mut add_comma = false;
for error in cause_iter {
if add_comma {
write!(f, ",")?;
} else {
add_comma = true;
}
write!(f, r#""{}""#, escape(&error.to_string()))?;
}
write!(f, "],")?
} else {
write!(f, r#""causes": [],"#)?;
}
if let Some(url) = diagnostic.url() {
write!(f, r#""url": "{}","#, &url.to_string())?;
}

View File

@ -1,5 +1,4 @@
mod json_report_handler {
use miette::{Diagnostic, MietteError, NamedSource, Report, SourceSpan};
use miette::JSONReportHandler;
@ -38,6 +37,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -83,6 +83,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -128,6 +129,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -173,6 +175,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -218,6 +221,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -262,6 +266,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -313,6 +318,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -372,6 +378,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -427,6 +434,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -500,6 +508,10 @@ mod json_report_handler {
"message": "wtf?!\nit broke :(",
"code": "oops::my::bad",
"severity": "error",
"causes": [
"something went wrong\n\nHere's a more detailed explanation of everything that actually went wrong because it's actually important.\n",
"very much went wrong"
],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -554,6 +566,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -609,6 +622,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -664,6 +678,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -706,6 +721,7 @@ mod json_report_handler {
{
"message": "oops!",
"severity": "error",
"causes": [],
"url": "https://example.com",
"help": "try doing it better next time?",
"labels": [],
@ -757,6 +773,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -772,6 +789,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file2.rs",
"labels": [
@ -788,6 +806,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file3.rs",
"labels": [
@ -852,6 +871,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -867,6 +887,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [
@ -883,6 +904,7 @@ mod json_report_handler {
"message": "oops!",
"code": "oops::my::bad",
"severity": "error",
"causes": [],
"help": "try doing it better next time?",
"filename": "bad_file.rs",
"labels": [