teo_parser/diagnostics/
formatter.rs

1use 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}