use std::fmt;
use std::io::Result;
use std::time::Duration;
use core::{EndpointId, EndpointSpec, Scheduled};
use core::network::Network;
pub trait Context : Network + Scheduler + fmt::Debug {
fn raise(&mut self, evt: Event);
fn check_send_ready_change(&mut self, was_ready: bool, is_ready: bool) {
if was_ready != is_ready {
self.raise(Event::CanSend(is_ready));
}
}
fn check_recv_ready_change(&mut self, was_ready: bool, is_ready: bool) {
if was_ready != is_ready {
self.raise(Event::CanRecv(is_ready));
}
}
}
pub trait Scheduler {
fn schedule(&mut self, schedulable: Schedulable, delay: Duration) -> Result<Scheduled>;
fn cancel(&mut self, scheduled: Scheduled);
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Command {
Poll
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Event {
CanSend(bool),
CanRecv(bool),
Closed
}
pub enum Schedulable {
Reconnect(EndpointId, EndpointSpec),
Rebind(EndpointId, EndpointSpec),
SendTimeout,
RecvTimeout,
ReqResend,
SurveyCancel
}
impl fmt::Debug for Scheduled {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl From<usize> for Scheduled {
fn from(value: usize) -> Scheduled {
Scheduled(value)
}
}
impl Into<usize> for Scheduled {
fn into(self) -> usize {
self.0
}
}
impl<'x> Into<usize> for &'x Scheduled {
fn into(self) -> usize {
self.0
}
}