use crate::process::{LErr, Trace}; use crate::validator::VErr; use crate::value::Value; use ariadne::{sources, Color, Label, Report, ReportKind}; use std::collections::HashSet; pub fn report_panic(err: LErr) { let mut srcs = HashSet::new(); let mut stack = vec![]; let mut order = 1; for entry in err.trace.iter().rev() { let Trace { callee, caller, function, arguments, input, src, } = entry; let (_, first_span) = callee; let (_, second_span) = caller; let Value::Fn(f) = function else { unreachable!() }; let fn_name = f.borrow().name.clone(); let i = first_span.start; let j = second_span.end; let label = Label::new((entry.input, i..j)) .with_color(Color::Yellow) .with_message(format!("({order}) calling `{fn_name}` with `{arguments}`")); order += 1; stack.push(label); srcs.insert((*input, *src)); } Report::build(ReportKind::Error, (err.input, err.span.into_range())) .with_message(format!("Ludus panicked! {}", err.msg)) .with_label(Label::new((err.input, err.span.into_range())).with_color(Color::Red)) .with_labels(stack) .with_note(err.extra) .finish() .print(sources(srcs.iter().copied())) .unwrap(); } pub fn report_invalidation(errs: Vec) { for err in errs { Report::build(ReportKind::Error, (err.input, err.span.into_range())) .with_message(err.msg.to_string()) .with_label(Label::new((err.input, err.span.into_range())).with_color(Color::Cyan)) .finish() .print(sources(vec![(err.input, err.src)])) .unwrap(); } }