nitinol-process 0.1.1

Pseudo-actor type process library for Nitinol using green thread of tokio
Documentation
use super::Receptor;
use crate::Process;
use std::any::{type_name, Any};
use std::sync::Arc;
use crate::errors::InvalidCast;

pub trait DynRef: 'static + Sync + Send {
    fn as_any(&self) -> &dyn Any;
}

pub(crate) struct AnyRef(Arc<dyn DynRef>);

impl AnyRef {
    pub fn downcast<T: Process>(&self) -> Result<Receptor<T>, InvalidCast> {
        self.0.as_any()
            .downcast_ref::<Receptor<T>>()
            .cloned()
            .ok_or(InvalidCast { to: type_name::<T>() })
    }
}

impl Clone for AnyRef {
    fn clone(&self) -> Self {
        Self(Arc::clone(&self.0))
    }
}

impl<T: Process> From<Receptor<T>> for AnyRef {
    fn from(value: Receptor<T>) -> Self {
        Self(Arc::new(value))
    }
}