teo_parser/diagnostics/
formatter.rs1use serde_json::to_string;
2use crate::diagnostics::diagnostics::{Diagnostics, DiagnosticsError, DiagnosticsLog, DiagnosticsWarning};
3use serde::Serialize;
4use crate::ast::span::Span;
5
6#[derive(Debug, Serialize)]
7struct DiagnosticsJsonItemSpan {
8 start: usize,
9 end: usize,
10 start_position: (usize, usize),
11 end_position: (usize, usize),
12}
13
14impl From<&Span> for DiagnosticsJsonItemSpan {
15
16 fn from(value: &Span) -> Self {
17 DiagnosticsJsonItemSpan {
18 start: value.start,
19 end: value.end,
20 start_position: value.start_position,
21 end_position: value.end_position,
22 }
23 }
24}
25
26#[derive(Debug, Serialize)]
27struct DiagnosticsJsonItem {
28 r#type: &'static str,
29 source: String,
30 message: String,
31 span: DiagnosticsJsonItemSpan,
32}
33
34impl From<&DiagnosticsError> for DiagnosticsJsonItem {
35
36 fn from(value: &DiagnosticsError) -> Self {
37 DiagnosticsJsonItem {
38 r#type: "error",
39 source: value.source_path().to_string(),
40 message: value.message().to_string(),
41 span: DiagnosticsJsonItemSpan::from(value.span()),
42 }
43 }
44}
45
46impl From<&DiagnosticsWarning> for DiagnosticsJsonItem {
47
48 fn from(value: &DiagnosticsWarning) -> Self {
49 DiagnosticsJsonItem {
50 r#type: "warning",
51 source: value.source_path().to_string(),
52 message: value.message().to_string(),
53 span: DiagnosticsJsonItemSpan::from(value.span()),
54 }
55 }
56}
57
58pub(crate) fn format_to_json(diagnostics: &Diagnostics, include_warnings: bool) -> String {
59 let mut result: Vec<DiagnosticsJsonItem> = vec![];
60 for error in diagnostics.errors() {
61 result.push(error.into());
62 }
63 if include_warnings {
64 for warning in diagnostics.warnings() {
65 result.push(warning.into());
66 }
67 }
68 to_string(&result).unwrap()
69}