#![deny(missing_docs)]
use ghost_actor::*;
ghost_chan! {
pub chan Message<GhostError> {
fn message(message: String) -> ();
}
}
pub type MessageReceiver = futures::channel::mpsc::Receiver<Message>;
ghost_chan! {
pub chan Parent<GhostError> {
fn attach_message_receiver(r: MessageReceiver) -> ();
}
}
pub async fn spawn_parent() -> GhostSender<Parent> {
let builder = actor_builder::GhostActorBuilder::new();
let channel_factory = builder.channel_factory().clone();
let sender = channel_factory.create_channel::<Parent>().await.unwrap();
tokio::task::spawn(builder.spawn(ParentImpl { channel_factory }));
sender
}
struct ParentImpl {
channel_factory: actor_builder::GhostActorChannelFactory<Self>,
}
impl GhostControlHandler for ParentImpl {}
impl GhostHandler<Message> for ParentImpl {}
impl MessageHandler for ParentImpl {
fn handle_message(&mut self, message: String) -> MessageHandlerResult<()> {
println!("received message: {}", message);
Ok(must_future::MustBoxFuture::new(async move { Ok(()) }))
}
}
impl GhostHandler<Parent> for ParentImpl {}
impl ParentHandler for ParentImpl {
fn handle_attach_message_receiver(
&mut self,
r: MessageReceiver,
) -> ParentHandlerResult<()> {
let fut = self.channel_factory.attach_receiver(r);
Ok(must_future::MustBoxFuture::new(async move {
fut.await?;
Ok(())
}))
}
}
#[tokio::main]
async fn main() {
let parent_sender = spawn_parent().await;
let (send1, recv1) = futures::channel::mpsc::channel(10);
let (send2, recv2) = futures::channel::mpsc::channel(10);
parent_sender.attach_message_receiver(recv1).await.unwrap();
parent_sender.attach_message_receiver(recv2).await.unwrap();
send1.message("test message 1".to_string()).await.unwrap();
send2.message("test message 2".to_string()).await.unwrap();
}