zestors/handler/
event_loop.rs1use crate::all::*;
2
3pub(crate) async fn event_loop<H: Handler>(mut handler: H, mut state: H::State) -> H::Exit {
5 let mut dead_events_in_a_row = 0;
6
7 loop {
8 let handler_item = state.next_handler_item().await;
9
10 if let HandlerItem::Event(Event::Dead) = &handler_item {
11 if dead_events_in_a_row > 5 {
12 panic!("Process should exit when receiving an `Event::Dead`!")
13 }
14 dead_events_in_a_row += 1;
15 } else {
16 dead_events_in_a_row = 0;
17 }
18
19 let handler_res = handler_item.handle_with(&mut handler, &mut state).await;
20
21 let exit_res = match handler_res {
22 Ok(Flow::Continue) => ExitFlow::Continue(handler),
23 Ok(Flow::ExitDirectly(exit)) => ExitFlow::Exit(exit),
24 Ok(Flow::Stop(stop)) => handler.handle_exit(&mut state, Ok(stop)).await,
25 Err(exception) => handler.handle_exit(&mut state, Err(exception)).await,
26 };
27
28 handler = match exit_res {
29 ExitFlow::Exit(exit) => break exit,
30 ExitFlow::Continue(handler) => handler,
31 }
32 }
33}