autoagents_core/actor/
subscriber.rs1use 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
38pub 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}