use core::error::Error;
use crate::allocation::AllocationError;
use crate::bytes::TraceSnapshotByteCount;
use crate::program::TraceSnapshotByteLimit;
use super::RunError;
#[derive(Debug, PartialEq, Eq)]
pub enum TracedRunError<E> {
Run(RunError),
Trace(E),
}
impl<E> Error for TracedRunError<E>
where
E: Error + 'static,
{
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
Self::Run(error) => Some(error),
Self::Trace(error) => Some(error),
}
}
}
impl<E> From<RunError> for TracedRunError<E> {
fn from(value: RunError) -> Self {
Self::Run(value)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TraceSnapshotError {
Limit {
limit: TraceSnapshotByteLimit,
attempted_len: TraceSnapshotByteCount,
},
Allocation(AllocationError),
}
impl Error for TraceSnapshotError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
Self::Limit { .. } => None,
Self::Allocation(error) => Some(error),
}
}
}
impl From<AllocationError> for TraceSnapshotError {
fn from(value: AllocationError) -> Self {
Self::Allocation(value)
}
}
#[derive(Debug, PartialEq, Eq)]
pub enum TraceSnapshotRunError<E> {
Run(RunError),
Snapshot(TraceSnapshotError),
Trace(E),
}
impl<E> Error for TraceSnapshotRunError<E>
where
E: Error + 'static,
{
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
Self::Run(error) => Some(error),
Self::Snapshot(error) => Some(error),
Self::Trace(error) => Some(error),
}
}
}
impl<E> From<RunError> for TraceSnapshotRunError<E> {
fn from(value: RunError) -> Self {
Self::Run(value)
}
}
impl<E> From<TraceSnapshotError> for TraceSnapshotRunError<E> {
fn from(value: TraceSnapshotError) -> Self {
Self::Snapshot(value)
}
}