autoagents_core/actor/
subscriber.rs

1use crate::actor::{AnyActor, CloneableMessage, SharedMessage};
2use ractor::ActorRef;
3use std::any::Any;
4use std::marker::PhantomData;
5use std::sync::Arc;
6
7pub struct TypedSubscriber<M: CloneableMessage> {
8    actors: Vec<Box<dyn AnyActor>>,
9    _marker: PhantomData<M>,
10}
11
12impl<M: CloneableMessage + 'static> Default for TypedSubscriber<M> {
13    fn default() -> Self {
14        Self::new()
15    }
16}
17
18impl<M: CloneableMessage + 'static> TypedSubscriber<M> {
19    pub fn new() -> Self {
20        Self {
21            actors: Vec::new(),
22            _marker: PhantomData,
23        }
24    }
25
26    pub fn add(&mut self, actor: ActorRef<M>) {
27        self.actors.push(Box::new(actor) as Box<dyn AnyActor>);
28    }
29
30    pub async fn publish(&self, message: M) {
31        let arc_msg: Arc<dyn Any + Send + Sync> = Arc::new(message);
32        for actor in &self.actors {
33            let _ = actor.send_any(arc_msg.clone()).await;
34        }
35    }
36}
37
38// Subscriber for shared messages
39pub struct SharedSubscriber<M: Send + Sync + 'static> {
40    actors: Vec<Box<dyn AnyActor>>,
41    _marker: PhantomData<M>,
42}
43
44impl<M: Send + Sync + 'static> Default for SharedSubscriber<M> {
45    fn default() -> Self {
46        Self::new()
47    }
48}
49
50impl<M: Send + Sync + 'static> SharedSubscriber<M> {
51    pub fn new() -> Self {
52        Self {
53            actors: Vec::new(),
54            _marker: PhantomData,
55        }
56    }
57
58    pub fn add(&mut self, actor: ActorRef<SharedMessage<M>>) {
59        self.actors.push(Box::new(actor) as Box<dyn AnyActor>);
60    }
61
62    pub async fn publish(&self, message: SharedMessage<M>) {
63        let arc_msg: Arc<dyn Any + Send + Sync> = Arc::new(message);
64        for actor in &self.actors {
65            let _ = actor.send_any(arc_msg.clone()).await;
66        }
67    }
68}