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 let mut poller = Poller::new()?;
10
11 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 trimmed != "q"
20 }
21 Err(e) => {
22 println!("error: {}", e);
23 false
24 }
25 }
26 });
27
28 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 let events = poller.pull_events(1000)?;
40 for (_fd, _events, _ctx) in events.iter() {
41 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}