use base::Result;
use base::VariableSize;
use base::Checkable;
use base::Datable;
use base::{Eval, EvalMut};
pub trait ClientTransport<A>
where A: Datable + VariableSize,
Self: 'static + Sized + Send + Sync + Clone + Checkable
{
fn connect(address: &A) -> Result<Self>;
fn disconnect(&mut self) -> Result<()>;
fn send(&mut self, data: &[u8]) -> Result<()>;
fn recv(&mut self) -> Result<Vec<u8>>;
fn eval<Ev: Eval<Self, P, R>, P: Datable, R: Datable>(&self, params: &P, evaluator: &Ev) -> Result<R> {
self.check()?;
params.check()?;
evaluator.eval(self, params)
}
fn eval_mut<EvM: EvalMut<Self, P, R>, P: Datable, R: Datable>(&mut self, params: &P, evaluator: &mut EvM) -> Result<R> {
self.check()?;
params.check()?;
let result = evaluator.eval_mut(self, params)?;
self.check()?;
Ok(result)
}
}
pub trait ServerTransport<A, CT>
where A: Datable + VariableSize,
CT: ClientTransport<A>,
Self: 'static + Sized + Send + Sync + Checkable
{
fn listen(address: &A) -> Result<Self>;
fn accept(&mut self) -> Result<(CT, A)>;
fn close(&mut self) -> Result<()>;
fn eval<Ev: Eval<Self, P, R>, P: Datable, R: Datable>(&self, params: &P, evaluator: &Ev) -> Result<R> {
self.check()?;
params.check()?;
evaluator.eval(self, params)
}
fn eval_mut<EvM: EvalMut<Self, P, R>, P: Datable, R: Datable>(&mut self, params: &P, evaluator: &mut EvM) -> Result<R> {
self.check()?;
params.check()?;
let result = evaluator.eval_mut(self, params)?;
self.check()?;
Ok(result)
}
}