use base::Result;
use base::size::ConstantSize;
use base::Serializable;
use base::Checkable;
use base::Datable;
use base::{Eval, EvalMut};
use io::store::Store;
use io::network::message::Request;
use io::network::message::Response;
pub trait Handler<St, StS, S, D, P>
where St: Store<StS>,
StS: Datable + Serializable,
S: Datable,
D: Ord + Datable + ConstantSize,
P: Datable,
Self: 'static + Sized + Clone + Send + Sync,
{
fn middlewares(&mut self, _store: &mut St)
-> Result<Vec<Box<FnMut(&mut Self, &mut St, &Request<S, D, P>)
-> Result<(Request<S, D, P>)>>>>
{
Ok(vec![])
}
fn handle_ping(&mut self,
store: &mut St,
request: &Request<S, D, P>)
-> Result<Response<S, D, P>>;
fn handle_session(&mut self,
store: &mut St,
request: &Request<S, D, P>)
-> Result<Response<S, D, P>>;
fn handle_count(&mut self,
store: &mut St,
request: &Request<S, D, P>)
-> Result<Response<S, D, P>>;
fn handle_list(&mut self,
store: &mut St,
request: &Request<S, D, P>)
-> Result<Response<S, D, P>>;
fn handle_lookup(&mut self,
store: &mut St,
request: &Request<S, D, P>)
-> Result<Response<S, D, P>>;
fn handle_get(&mut self,
store: &mut St,
request: &Request<S, D, P>)
-> Result<Response<S, D, P>>;
fn handle_create(&mut self,
store: &mut St,
request: &Request<S, D, P>)
-> Result<Response<S, D, P>>;
fn handle_update(&mut self,
store: &mut St,
request: &Request<S, D, P>)
-> Result<Response<S, D, P>>;
fn handle_upsert(&mut self,
store: &mut St,
request: &Request<S, D, P>)
-> Result<Response<S, D, P>>;
fn handle_delete(&mut self,
store: &mut St,
request: &Request<S, D, P>)
-> Result<Response<S, D, P>>;
fn handle_eval<Ev>(&mut self,
store: &mut St,
request: &Request<S, D, P>,
evaluator: &Ev)
-> Result<Response<S, D, P>>
where Ev: Eval<St, Request<S, D, P>, Response<S, D, P>>
{
request.check()?;
let response = evaluator.eval(store, request)?;
response.check()?;
Ok(response)
}
fn handle_eval_mut<EvM>(&mut self,
store: &mut St,
request: &Request<S, D, P>,
evaluator: &mut EvM)
-> Result<Response<S, D, P>>
where EvM: EvalMut<St, Request<S, D, P>, Response<S, D, P>>
{
request.check()?;
let response = evaluator.eval_mut(store, request)?;
response.check()?;
Ok(response)
}
}