use actors_rs::*;
use std::time::Duration;
#[derive(Clone, Debug)]
pub struct Panic;
#[derive(Default)]
struct DumbActor;
impl Actor for DumbActor {
type Msg = ();
fn recv(&mut self, _: &Context<Self::Msg>, _: Self::Msg, _: Sender) {}
}
#[actor(Panic)]
#[derive(Default)]
struct PanicActor;
impl Actor for PanicActor {
type Msg = PanicActorMsg;
fn pre_start(&mut self, ctx: &Context<Self::Msg>) {
ctx.actor_of::<DumbActor>("child_a").unwrap();
ctx.actor_of::<DumbActor>("child_b").unwrap();
ctx.actor_of::<DumbActor>("child_c").unwrap();
ctx.actor_of::<DumbActor>("child_d").unwrap();
}
fn recv(&mut self, ctx: &Context<Self::Msg>, msg: Self::Msg, sender: Sender) {
self.receive(ctx, msg, sender);
}
}
impl Receive<Panic> for PanicActor {
type Msg = PanicActorMsg;
fn receive(&mut self, _ctx: &Context<Self::Msg>, _msg: Panic, _sender: Sender) {
panic!("// TEST PANIC // TEST PANIC // TEST PANIC //");
}
}
fn main() {
let sys = SystemBuilder::new().name("my-app").create().unwrap();
let sup = sys.actor_of::<PanicActor>("panic_actor").unwrap();
println!("Before panic we see supervisor and actor that will panic!");
std::thread::sleep(Duration::from_millis(500));
sys.print_tree();
sup.tell(Panic, None);
std::thread::sleep(Duration::from_millis(500));
println!("We should see panic printed, but we still alive and panic actor gone!");
sys.print_tree();
}