is_not_capnp/
service.rs

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}