1//! This implementation uses self-written stable facilities.
2
3use crate::{
4 abort_now, check_correctness,
5 diagnostic::{Diagnostic, Level},
6};
7use std::cell::RefCell;
8
9pub fn abort_if_dirty() {
10 check_correctness();
11 ERR_STORAGE.with(|storage: &RefCell>| {
12 if !storage.borrow().is_empty() {
13 abort_now()
14 }
15 });
16}
17
18pub(crate) fn cleanup() -> Vec<Diagnostic> {
19 ERR_STORAGE.with(|storage: &RefCell>| storage.replace(Vec::new()))
20}
21
22pub(crate) fn emit_diagnostic(diag: Diagnostic) {
23 if diag.level == Level::Error {
24 ERR_STORAGE.with(|storage: &RefCell>| storage.borrow_mut().push(diag));
25 }
26}
27
28thread_local! {
29 static ERR_STORAGE: RefCell<Vec<Diagnostic>> = RefCell::new(Vec::new());
30}
31