#[macro_use]
extern crate herbert;
use herbert::prelude::*;
fn main() {
let router = Router::run("example");
spawn_actor!(router, "pow", pow).unwrap();
println!("sending pow: 12");
let (msg, rx) = CustomMessage::new(12);
send_actor!(router, "pow", msg).unwrap();
let result = rx.recv().unwrap();
println!("result: {}", result);
router.shutdown();
}
struct CustomMessage {
value: i64,
resp: Sender<i64>,
}
impl CustomMessage {
fn new(val: i64) -> (Self, Receiver<i64>) {
let (sender, receiver) = unbounded();
(
Self {
value: val,
resp: sender,
},
receiver,
)
}
}
fn pow(ctx: ActorContext) {
loop {
select! {
recv(ctx.req) -> msg => {
if let Some(message) = msg.unwrap().downcast_ref::<CustomMessage>() {
message.resp.send(message.value * message.value).unwrap();
}
}
recv(ctx.ctl) -> _ => break,
}
}
ctx.report_stopped().unwrap();
}