Quickwit actors

Yet another actor crate for rust. This crate exists specifically to answer quickwit needs. The API may change in the future.

Objective

Non-objective

Features

Example

```rust use std::time::Duration; use asynctrait::asynctrait; use quickwit_actors::{Handler, Actor, Universe, ActorContext, ActorExitStatus, Mailbox};

[derive(Default)]

struct PingReceiver;

impl Actor for PingReceiver { type ObservableState = (); fn observable_state(&self) -> Self::ObservableState {} }

[async_trait]

impl Handler for PingReceiver { type Reply = String; async fn handle( &mut self, msg: Ping, _ctx: &ActorContext, ) -> Result { Ok("Pong".tostring()) } }

struct PingSender { peer: Mailbox, }

[derive(Debug)]

struct Loop;

[derive(Debug)]

struct Ping;

[async_trait]

impl Actor for PingSender { type ObservableState = (); fn observable_state(&self) -> Self::ObservableState {}

async fn initialize(&mut self, ctx: &ActorContext<Self>) -> Result<(),ActorExitStatus> {
    ctx.send_self_message(Loop).await?;
    Ok(())
}

}

[async_trait]

impl Handler for PingSender { type Reply = ();

async fn handle(
    &mut self,
    _: Loop,
    ctx: &ActorContext<Self>,
) -> Result<(), ActorExitStatus> {
    let reply_msg = ctx.ask(&self.peer, Ping).await.unwrap();
    println!("{reply_msg}");
    ctx.schedule_self_msg(Duration::from_secs(1), Loop).await;
    Ok(())
}

}

[tokio::main]

async fn main() { let universe = Universe::new();

let (recv_mailbox, _) =
    universe.spawn_actor(PingReceiver::default()).spawn();

let ping_sender = PingSender { peer: recv_mailbox };
let (_, ping_sender_handler) = universe.spawn_actor(ping_sender).spawn();

ping_sender_handler.join().await;

} ```