use std::any::Any;
use std::cell::Cell;
use std::io;
use std::os::fd::AsFd;
use crate::thin::ThinBoxSubscriber;
use crate::{Event, EventpOps, EventpOpsAdd, Interest, Pinned};
pub trait Subscriber<Ep: EventpOps>: AsFd + HasInterest + Handler<Ep> + Any {
fn register_into<R>(self, eventp: &mut R) -> io::Result<()>
where
Self: Sized,
R: EventpOpsAdd<Ep>,
{
eventp.add(ThinBoxSubscriber::new(self))
}
}
impl<S, Ep> Subscriber<Ep> for S
where
S: 'static + AsFd + HasInterest + Handler<Ep>,
Ep: EventpOps,
{
}
pub trait HasInterest {
fn interest(&self) -> &Cell<Interest>;
}
pub trait Handler<Ep: EventpOps> {
fn handle(&mut self, event: Event, eventp: Pinned<'_, Ep>);
}