tyra 1.0.0

Typed Actor System
Documentation
use crate::message::delayed_message::DelayedMessage;
use crate::prelude::{ActorSystem, ActorWrapper, Handler};
use crate::router::{AddActorMessage, RoundRobinRouter, RoundRobinRouterFactory};
use crate::system::delay_actor::{DelayActor, DelayActorFactory};
use log::error;
use std::time::Duration;
use crate::message::actor_message::BaseActorMessage;

#[derive(Clone)]
pub struct InternalActorManager {
    delay_router: Option<ActorWrapper<RoundRobinRouter<DelayActor>>>,
}

impl InternalActorManager {
    pub fn new() -> Self {
        Self { delay_router: None }
    }
    pub fn init(&mut self, system: ActorSystem) {
        let delay_builder = system
            .builder()
            .set_pool_name("tyra")
            .set_mailbox_unbounded();
        let delay_router = system
            .builder()
            .set_pool_name("tyra")
            .set_mailbox_unbounded()
            .spawn("delay-router", RoundRobinRouterFactory::new())
            .unwrap();
        let remaining_actors = system.get_available_actor_count_for_pool("tyra").unwrap();
        for i in 0..remaining_actors {
            let delay_actor = delay_builder
                .spawn(format!("delay-{}", i), DelayActorFactory::new())
                .unwrap();
            let result = delay_router.send(AddActorMessage::new(delay_actor));
            if result.is_err() {
                error!("Could not add delay_actor to delay_router");
            }
        }
        self.delay_router = Some(delay_router);
    }

    pub fn send_after<A, M>(&self, msg: M, destination: ActorWrapper<A>, duration: Duration)
    where
        M: BaseActorMessage + 'static,
        A: Handler<M> + 'static,
    {
        let result =
            self.delay_router
                .as_ref()
                .unwrap()
                .send(DelayedMessage::new(
                    msg,
                    destination,
                    duration,
                ));
        if result.is_err() {
            error!("Could not send message to delay router");
        }
    }
}