use any_pointer;
use MessageSize;
use capability::{Params, Promise, Request, RemotePromise, Results};
pub trait ResponseHook {
fn get<'a>(&'a self) -> ::Result<any_pointer::Reader<'a>>;
}
pub trait RequestHook {
fn get<'a>(&'a mut self) -> any_pointer::Builder<'a>;
fn get_brand(&self) -> usize;
fn send<'a>(self: Box<Self>) -> RemotePromise<any_pointer::Owned>;
fn tail_send(self: Box<Self>)
-> Option<(u32, ::capability::Promise<(), ::Error>, Box<PipelineHook>)>;
}
pub trait ClientHook {
fn add_ref(&self) -> Box<ClientHook>;
fn new_call(&self,
interface_id: u64,
method_id: u16,
size_hint: Option<MessageSize>)
-> Request<any_pointer::Owned, any_pointer::Owned>;
fn call(&self, interface_id: u64, method_id: u16,
params: Box<ParamsHook>, results: Box<ResultsHook>)
-> ::capability::Promise<(), ::Error>;
fn get_brand(&self) -> usize;
fn get_ptr(&self) -> usize;
fn get_resolved(&self) -> Option<Box<ClientHook>>;
fn when_more_resolved(&self) -> Option<::capability::Promise<Box<ClientHook>, ::Error>>;
#[cfg(feature = "rpc")]
fn when_resolved(&self) -> Promise<(), ::Error> {
use futures::Future;
match self.when_more_resolved() {
Some(promise) => {
Promise::from_future(promise.and_then(|resolution| {
resolution.when_resolved()
}))
}
None => {
Promise::ok(())
}
}
}
}
impl Clone for Box<ClientHook> {
fn clone(&self) -> Box<ClientHook> {
self.add_ref()
}
}
pub trait ServerHook: 'static {
fn new_client(server: Box<::capability::Server>) -> ::capability::Client;
}
pub trait ResultsHook {
fn get<'a>(&'a mut self) -> ::Result<any_pointer::Builder<'a>>;
fn allow_cancellation(&self);
fn tail_call(self: Box<Self>, request: Box<RequestHook>) -> Promise<(), ::Error>;
fn direct_tail_call(self: Box<Self>, request: Box<RequestHook>) ->
(::capability::Promise<(), ::Error>, Box<PipelineHook>);
}
pub trait ParamsHook {
fn get<'a>(&'a self) -> ::Result<any_pointer::Reader<'a>>;
}
pub fn internal_get_typed_params<T>(typeless: Params<any_pointer::Owned>) -> Params<T> {
Params { hook: typeless.hook, marker: ::std::marker::PhantomData }
}
pub fn internal_get_typed_results<T>(typeless: Results<any_pointer::Owned>) -> Results<T> {
Results { hook: typeless.hook, marker: ::std::marker::PhantomData }
}
pub fn internal_get_untyped_results<T>(typeful: Results<T>) -> Results<any_pointer::Owned> {
Results { hook: typeful.hook, marker: ::std::marker::PhantomData }
}
pub trait PipelineHook {
fn add_ref(&self) -> Box<PipelineHook>;
fn get_pipelined_cap(&self, ops: &[PipelineOp]) -> Box<ClientHook>;
fn get_pipelined_cap_move(&self, ops: Vec<PipelineOp>) -> Box<ClientHook> {
self.get_pipelined_cap(&ops)
}
}
impl Clone for Box<PipelineHook> {
fn clone(&self) -> Box<PipelineHook> {
self.add_ref()
}
}
#[derive(Clone, Copy)]
pub enum PipelineOp {
Noop,
GetPointerField(u16),
}