pub mod posix_select;
use core::{fmt::Debug, time::Duration};
use iceoryx2_bb_posix::{
file_descriptor::FileDescriptor, file_descriptor_set::SynchronousMultiplexing,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReactorCreateError {
UnknownError(i32),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReactorAttachError {
AlreadyAttached,
CapacityExceeded,
UnknownError(i32),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReactorWaitError {
Interrupt,
InsufficientPermissions,
UnknownError,
}
pub trait ReactorGuard<'reactor, 'attachment> {
fn file_descriptor(&self) -> &FileDescriptor;
}
pub trait Reactor: Sized + Debug {
type Guard<'reactor, 'attachment>: ReactorGuard<'reactor, 'attachment>
where
Self: 'reactor;
type Builder: ReactorBuilder<Self>;
fn capacity(&self) -> usize;
fn len(&self) -> usize;
fn is_empty(&self) -> bool;
fn attach<'reactor, 'attachment, F: SynchronousMultiplexing + Debug>(
&'reactor self,
value: &'attachment F,
) -> Result<Self::Guard<'reactor, 'attachment>, ReactorAttachError>;
fn try_wait<F: FnMut(&FileDescriptor)>(&self, fn_call: F) -> Result<usize, ReactorWaitError>;
fn timed_wait<F: FnMut(&FileDescriptor)>(
&self,
fn_call: F,
timeout: Duration,
) -> Result<usize, ReactorWaitError>;
fn blocking_wait<F: FnMut(&FileDescriptor)>(
&self,
fn_call: F,
) -> Result<usize, ReactorWaitError>;
}
pub trait ReactorBuilder<T: Reactor> {
fn new() -> Self;
fn create(self) -> Result<T, ReactorCreateError>;
}