1use async_std::net::TcpStream;
2use capnp::capability::Client;
3use capnp_rpc::{rpc_twoparty_capnp::Side, twoparty, RpcSystem};
4use std::marker::PhantomData;
5
6#[derive(Clone)]
7pub struct Service<T, S>
8where
9 T: capnp::capability::FromServer<S> + Clone,
10 S: Clone,
11{
12 pub id: u8,
13 pub capability: T,
14 __: PhantomData<S>,
15}
16
17impl<T, S> Service<T, S>
18where
19 T: capnp::capability::FromServer<S> + Clone,
20 S: Clone,
21{
22 pub fn new(id: u8, capability: T) -> Self {
23 Self {
24 id,
25 capability,
26 __: PhantomData,
27 }
28 }
29}
30
31pub trait CapnpService {
32 fn rpc_system(&self, reader: TcpStream, writer: TcpStream, side: Side) -> RpcSystem<Side>;
33}
34
35impl<T, S> CapnpService for Service<T, S>
36where
37 T: capnp::capability::FromServer<S> + Clone,
38 S: Clone,
39{
40 fn rpc_system(&self, reader: TcpStream, writer: TcpStream, side: Side) -> RpcSystem<Side> {
41 let network = twoparty::VatNetwork::new(reader, writer, side, Default::default());
42
43 let client = if side.eq(&Side::Server) {
44 Some(Client::new(self.capability.clone().into_client_hook()))
45 } else {
46 None
47 };
48
49 RpcSystem::new(Box::new(network), client)
50 }
51}