zestors/handler/
event_loop.rs

1use crate::all::*;
2
3/// Runs the event-loop of the handler.
4pub(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}