pub use gruggers_core::error::*;
use crate::arena::Arena;
use std::ffi::OsStr;
pub type Result<T> = std::result::Result<T, Error>;
pub struct Error {
inner_error: GrugError<'static>,
_arena: Arena
}
impl std::error::Error for Error { }
impl std::fmt::Debug for Error {
fn fmt (&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.inner_error.fmt(f)
}
}
impl std::fmt::Display for Error {
fn fmt (&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.inner_error.fmt(f)
}
}
impl Error {
pub fn inner<'a>(&'a self) -> &'a GrugError<'a> {
&self.inner_error
}
pub fn leak<'a>(self) -> GrugError<'static> {
let inner = unsafe{std::mem::transmute::<GrugError, GrugError<'static>>(*self.inner())};
std::mem::forget(self);
inner
}
#[track_caller]
pub(crate) fn new(error_kind: ErrorKind, function_name: &str, file_path: &OsStr, source_text: &str, err_span: SourceSpan, error_message: std::fmt::Arguments) -> Self {
let arena = Arena::new();
let error = GrugError::new_error_in(error_kind, function_name, file_path, source_text, err_span, error_message, &arena);
let error = unsafe{std::mem::transmute::<GrugError, GrugError<'static>>(error)};
Self {
inner_error: error,
_arena: arena
}
}
#[track_caller]
pub(crate) fn from_io_error(err: std::io::Error, file_path: &OsStr) -> Self {
Self::new(
ErrorKind::IO_ERROR,
"",
file_path,
"",
SourceSpan {offset: 0, line: 0},
format_args!("IO error: {}", err),
)
}
}