use core::fmt;
#[doc(hidden)]
#[macro_export]
macro_rules! rssn_error {
(
$(#[$meta:meta])*
$vis:vis enum $name:ident {
$(
$(#[$variant_meta:meta])*
$variant:ident $( { $( $(#[$field_meta:meta])* $field:ident : $ftype:ty ),* $(,)? } )? $( ( $( $(#[$tuple_meta:meta])* $tname:ident : $ttype:ty ),* $(,)? ) )?
),* $(,)?
}
) => {
$(#[$meta])*
$vis enum $name {
$(
$(#[$variant_meta])*
$variant $( { $( $(#[$field_meta])* $field : $ftype ),* } )? $( ( $( $(#[$tuple_meta])* $ttype ),* ) )?,
)*
}
pastey::paste! {
$(
$(#[$variant_meta])*
#[doc(hidden)]
#[cold]
#[track_caller]
#[inline(never)]
pub const fn [<cold_ $name:snake _ $variant:snake>]<T>(
$($($field : $ftype),*)?
$($($tname : $ttype),*)?
) -> core::result::Result<T, $name> {
core::result::Result::Err($name::$variant $( { $($field),* } )? $( ( $( $tname ),* ) )?)
}
)*
}
};
}
rssn_error! {
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AstError {
ProjectionOverflow,
RelPtrOverflow,
UnknownSymbolKind,
CycleDetected,
}
}
rssn_error! {
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DagError {
ArenaFull,
DanglingId,
NullSentinel,
ArityOverflow,
}
}
rssn_error! {
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum JitError {
VerifierRejected,
UnknownFunction,
BudgetExhausted,
MalformedNode,
InitFailed,
}
}
rssn_error! {
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ParallelError {
NotSplittable,
WorkerLost,
MissingVariable,
}
}
rssn_error! {
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ParserError {
UnexpectedEof,
UnexpectedToken,
ParenDepthExceeded,
InvalidNumber,
}
}
rssn_error! {
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StorageError {
Io,
CorruptHeader,
VersionMismatch,
MmapUnsupported,
}
}
rssn_error! {
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum FfiError {
NullArgument,
InvalidUtf8,
StaleHandle,
RuntimeUninitialized,
}
}
macro_rules! impl_display {
($($t:ty),* $(,)?) => {
$(
impl fmt::Display for $t {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(self, f)
}
}
)*
};
}
impl_display!(
AstError,
DagError,
JitError,
ParallelError,
ParserError,
StorageError,
FfiError,
);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn cold_constructor_returns_err_variant() {
let r: Result<(), DagError> = cold_dag_error_arena_full();
assert_eq!(r, Err(DagError::ArenaFull));
}
#[test]
fn cold_constructor_for_every_module() {
let _: Result<u8, AstError> = cold_ast_error_projection_overflow();
let _: Result<u8, JitError> = cold_jit_error_verifier_rejected();
let _: Result<u8, ParallelError> = cold_parallel_error_not_splittable();
let _: Result<u8, ParserError> = cold_parser_error_unexpected_eof();
let _: Result<u8, StorageError> = cold_storage_error_io();
let _: Result<u8, FfiError> = cold_ffi_error_null_argument();
}
#[test]
fn display_uses_debug() {
assert_eq!(format!("{}", DagError::ArenaFull), "ArenaFull");
}
}