1use eure::document::OriginMap;
4use eure::query::assets::TextFile;
5use eure::query_flow::{Db, QueryError};
6use eure::report::{ErrorReport, ErrorReports, Origin};
7use eure::tree::Cst;
8use eure_tree::tree::InputSpan;
9
10use crate::check::CheckResult;
11use crate::error::ReferenceError;
12
13pub struct EumdReportContext<'a> {
15 pub file: TextFile,
17 pub cst: &'a Cst,
19 pub origins: &'a OriginMap,
21}
22
23pub fn report_check_errors(result: &CheckResult, ctx: &EumdReportContext<'_>) -> ErrorReports {
25 result
26 .errors
27 .iter()
28 .map(|error| report_reference_error(error, ctx))
29 .collect()
30}
31
32fn report_reference_error(error: &ReferenceError, ctx: &EumdReportContext<'_>) -> ErrorReport {
33 let title = format!(
34 "Undefined !{}[{}] {}",
35 error.ref_type, error.key, error.location
36 );
37
38 let span = if let (Some(node_id), Some(offset), Some(len)) =
40 (error.node_id, error.offset, error.len)
41 {
42 if let Some(node_span) = ctx.origins.get_value_span(node_id, ctx.cst) {
44 let content_start = get_code_block_content_start(ctx, node_span);
48
49 let start = content_start + offset;
50 let end = start + len;
51 InputSpan { start, end }
52 } else {
53 InputSpan::EMPTY
54 }
55 } else {
56 InputSpan::EMPTY
57 };
58
59 let origin = Origin::new(ctx.file.clone(), span);
60 ErrorReport::error(title, origin)
61}
62
63fn get_code_block_content_start(_ctx: &EumdReportContext<'_>, node_span: InputSpan) -> u32 {
65 node_span.start
72}
73
74pub fn format_check_errors(
78 db: &impl Db,
79 result: &CheckResult,
80 file: TextFile,
81 cst: &Cst,
82 origins: &OriginMap,
83 styled: bool,
84) -> Result<String, QueryError> {
85 let ctx = EumdReportContext { file, cst, origins };
86 let reports = report_check_errors(result, &ctx);
87 eure::report::format_error_reports(db, &reports, styled)
88}
89
90pub fn format_check_errors_plain(
94 db: &impl Db,
95 result: &CheckResult,
96 file: TextFile,
97 cst: &Cst,
98 origins: &OriginMap,
99) -> Result<String, QueryError> {
100 format_check_errors(db, result, file, cst, origins, false)
101}