use std::{cell::RefCell, rc::Rc};
use crate::story::Story;
pub trait ErrorHandler {
fn error(&mut self, message: &str, error_type: ErrorType);
}
#[derive(PartialEq, Clone, Copy)]
pub enum ErrorType {
Warning,
Error,
}
impl Story {
pub fn set_error_handler(&mut self, err_handler: Rc<RefCell<dyn ErrorHandler>>) {
self.on_error = Some(err_handler);
}
pub(crate) fn add_error(&mut self, message: &str, is_warning: bool) {
let error_type_str = if is_warning { "WARNING" } else { "ERROR" };
let m = if !self.get_state().get_current_pointer().is_null() {
format!(
"RUNTIME {}: ({}): {}",
error_type_str,
self.get_state().get_current_pointer().get_path().unwrap(),
message
)
} else {
format!("RUNTIME {}: {}", error_type_str, message)
};
self.get_state_mut().add_error(m, is_warning);
if !is_warning {
self.get_state_mut().force_end();
}
}
pub(crate) fn reset_errors(&mut self) {
self.get_state_mut().reset_errors();
}
pub fn has_error(&self) -> bool {
self.get_state().has_error()
}
pub fn get_current_errors(&self) -> &[String] {
self.get_state().get_current_errors()
}
pub fn get_current_warnings(&self) -> &[String] {
self.get_state().get_current_warnings()
}
}