callback/
callback.rs

1use poller::{EventContext, Events, Poller};
2use std::io::stdin;
3use std::sync::Arc;
4
5type Callback = fn() -> bool;
6
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8    // Create the Poller.
9    let mut poller = Poller::new()?;
10
11    // Callback for handle raised event.
12    let cb: Arc<Callback> = Arc::new(|| -> bool {
13        let mut input = String::new();
14        match stdin().read_line(&mut input) {
15            Ok(n) => {
16                let trimmed = input.trim_end();
17                println!("{} bytes readed: \"{}\"", n, trimmed);
18                // Return false if input 'q'.
19                trimmed != "q"
20            }
21            Err(e) => {
22                println!("error: {}", e);
23                false
24            }
25        }
26    });
27
28    // Add stdin to the watching list of the Poller.
29    poller.add(
30        0,
31        Events::new().read(),
32        Some(Arc::clone(&cb) as EventContext),
33    )?;
34
35    println!("Press ctrl+c or 'q' to exit ...");
36
37    'outer: loop {
38        // Pull all events with 1 seconds timeout.
39        let events = poller.pull_events(1000)?;
40        for (_fd, _events, _ctx) in events.iter() {
41            // Use EventContext to processing the event.
42            if let Some(x) = _ctx {
43                if let Some(cb) = x.downcast_ref::<Callback>() {
44                    if cb() == false {
45                        break 'outer;
46                    }
47                }
48            }
49        }
50    }
51
52    Ok(())
53}