xacto 0.1.0

Simple Erlang-style actors for Rust.
Documentation
#[derive(Debug)]
pub enum CallError<M> {
    Send(SendError<M>),
    Recv(RecvError),
}

#[derive(Debug)]
pub enum ActorError {
    Link(LinkError<(), ()>),
    Send(SendError<()>),
    Recv(RecvError),
    Unknown(Box<dyn std::error::Error + Send + 'static>),
}

#[derive(Debug)]
pub enum LinkError<U, M> {
    Unavailable(U),
    Send(SendError<M>),
    Call(CallError<M>),
}

#[derive(Debug)]
pub enum SendError<M> {
    Full(M),
    Closed(M),
}

#[derive(Debug)]
pub enum RecvError {
    Timeout,
    Closed,
}

impl std::fmt::Display for ActorError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            ActorError::Link(e) => write!(f, "actor link error: {:?}", e),
            ActorError::Send(e) => write!(f, "actor send error: {:?}", e),
            ActorError::Recv(e) => write!(f, "actor recv error: {:?}", e),
            ActorError::Unknown(e) => write!(f, "actor unknown error: {:?}", e),
        }
    }
}

impl<E> From<E> for ActorError
where
    E: std::error::Error + Send + 'static,
{
    fn from(e: E) -> Self {
        ActorError::Unknown(Box::new(e))
    }
}

impl<M> From<SendError<M>> for ActorError {
    fn from(value: SendError<M>) -> Self {
        match value {
            SendError::Full(_) => ActorError::Send(SendError::Full(())),
            SendError::Closed(_) => ActorError::Send(SendError::Closed(())),
        }
    }
}

impl<M> From<CallError<M>> for ActorError {
    fn from(value: CallError<M>) -> Self {
        match value {
            CallError::Send(e) => e.into(),
            CallError::Recv(e) => ActorError::Recv(e),
        }
    }
}