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)) =
44 (error.node_id, error.offset, error.len)
45 {
46 if let Some(node_span) = ctx.origins.get_value_span(node_id, ctx.cst) {
48 let content_start = get_code_block_content_start(ctx, node_span);
52
53 let start = content_start + offset;
54 let end = start + len;
55 InputSpan { start, end }
56 } else {
57 InputSpan::EMPTY
58 }
59 } else {
60 InputSpan::EMPTY
61 };
62
63 let origin = Origin::new(ctx.file.clone(), span);
64 ErrorReport::error(title, origin)
65}
66
67fn get_code_block_content_start(_ctx: &EumdReportContext<'_>, node_span: InputSpan) -> u32 {
69 node_span.start
76}
77
78pub fn format_check_errors(
82 db: &impl Db,
83 result: &CheckResult,
84 file: TextFile,
85 cst: &Cst,
86 origins: &OriginMap,
87 styled: bool,
88) -> Result<String, QueryError> {
89 let ctx = EumdReportContext { file, cst, origins };
90 let reports = report_check_errors(result, &ctx);
91 eure::report::format_error_reports(db, &reports, styled)
92}
93
94pub fn format_check_errors_plain(
98 db: &impl Db,
99 result: &CheckResult,
100 file: TextFile,
101 cst: &Cst,
102 origins: &OriginMap,
103) -> Result<String, QueryError> {
104 format_check_errors(db, result, file, cst, origins, false)
105}