use poller::{EventContext, Events, Poller};
use std::io::stdin;
use std::sync::Arc;
type Callback = fn() -> bool;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut poller = Poller::new()?;
let cb: Arc<Callback> = Arc::new(|| -> bool {
let mut input = String::new();
match stdin().read_line(&mut input) {
Ok(n) => {
let trimmed = input.trim_end();
println!("{} bytes readed: \"{}\"", n, trimmed);
trimmed != "q"
}
Err(e) => {
println!("error: {}", e);
false
}
}
});
poller.add(
0,
Events::new().read(),
Some(Arc::clone(&cb) as EventContext),
)?;
println!("Press ctrl+c or 'q' to exit ...");
'outer: loop {
let events = poller.pull_events(1000)?;
for (_fd, _events, _ctx) in events.iter() {
if let Some(x) = _ctx {
if let Some(cb) = x.downcast_ref::<Callback>() {
if cb() == false {
break 'outer;
}
}
}
}
}
Ok(())
}