yaaf 0.1.0

Yet Another Actor Framework
Documentation
use crate::{
    message::detail::MessageList, message::Message, publisher::Publisher, router::ConcreteRouter,
    router::Router,
};
use ::async_trait::async_trait;
use ::std::{any::TypeId, collections::HashMap, sync::Arc};

pub struct SourceContext {
    routers: HashMap<TypeId, Arc<dyn Router>>,
}

impl SourceContext {
    pub(crate) fn new(routers: HashMap<TypeId, Arc<dyn Router>>) -> Self {
        SourceContext { routers }
    }

    pub fn publish<P, M>(&mut self, _publisher: &P, message: M)
    where
        P: Source + Publisher<M>,
        M: Message,
    {
        let type_id = TypeId::of::<M>();
        let router = self
            .routers
            .get(&type_id)
            .unwrap()
            .as_any()
            .downcast_ref::<ConcreteRouter<M>>()
            .unwrap();
        router.broadcast(message)
    }
}

pub trait SourceMeta {
    type Publishes: MessageList;
}

#[async_trait]
pub trait Source: SourceMeta {
    async fn run(mut self, ctx: SourceContext);
}