use acton_reactive::prelude::*;
#[acton_actor]
struct BasicActorState {
some_state: usize,
}
#[acton_message]
struct PingMsg;
#[acton_message]
struct PongMsg;
#[acton_message]
struct BuhByeMsg;
#[acton_main]
async fn main() {
let mut runtime = ActonApp::launch_async().await;
let mut actor_builder = runtime.new_actor::<BasicActorState>();
actor_builder
.mutate_on::<PingMsg>(|actor, envelope| {
println!("Pinged. You can mutate me!");
actor.model.some_state += 1;
let reply_envelope = envelope.reply_envelope();
Reply::pending(async move {
reply_envelope.send(PongMsg).await;
})
})
.mutate_on::<PongMsg>(|actor, _envelope| {
println!("I got ponged!");
actor.model.some_state += 1;
let self_handle = actor.handle().clone();
Reply::pending(async move {
self_handle.send(BuhByeMsg).await;
})
})
.mutate_on::<BuhByeMsg>(|_actor, _envelope| {
println!("Thanks for all the fish! Buh Bye!");
Reply::ready()
})
.after_stop(|actor| {
println!("Actor stopped with state value: {}", actor.model.some_state);
debug_assert_eq!(actor.model.some_state, 2);
Reply::ready()
});
let actor_handle = actor_builder.start().await;
actor_handle.send(PingMsg).await;
runtime
.shutdown_all()
.await
.expect("Failed to shut down system");
}