fidl_next_bind/
service.rs1use core::marker::PhantomData;
6use core::ops::Deref;
7
8use fidl_next_protocol::ServiceHandler;
9
10pub trait DiscoverableService {
12 const SERVICE_NAME: &'static str;
14 const MEMBER_NAMES: &'static [&'static str];
16}
17
18pub trait HasServiceRequest<T> {}
24
25pub trait Service<C>: DiscoverableService {
32 type Connector;
35}
36
37#[repr(transparent)]
39pub struct ServiceConnector<S, C> {
40 connector: C,
41 service: PhantomData<S>,
42}
43
44unsafe impl<S, C: Send> Send for ServiceConnector<S, C> {}
45unsafe impl<S, C: Sync> Sync for ServiceConnector<S, C> {}
46
47impl<S, C> ServiceConnector<S, C> {
48 pub fn from_untyped(connector: C) -> Self {
50 Self { connector, service: PhantomData }
51 }
52}
53
54impl<S: Service<C>, C> Deref for ServiceConnector<S, C> {
55 type Target = S::Connector;
56
57 fn deref(&self) -> &Self::Target {
58 unsafe { &*(self as *const Self).cast::<S::Connector>() }
60 }
61}
62
63pub trait InstanceFromServiceTransport<T> {
66 fn from_service_transport(handle: T) -> Self;
68}
69
70impl<T> InstanceFromServiceTransport<T> for T {
72 fn from_service_transport(handle: T) -> Self {
73 handle
74 }
75}
76
77pub trait DispatchServiceHandler<
79 H,
80 #[cfg(feature = "fuchsia")] T = zx::Channel,
81 #[cfg(not(feature = "fuchsia"))] T,
82>
83{
84 fn on_connection(handler: &H, member: &str, server_end: T);
86}
87
88pub struct ServiceHandlerAdapter<S, H> {
90 handler: H,
91 _service: PhantomData<S>,
92}
93
94impl<S, H: Clone> Clone for ServiceHandlerAdapter<S, H> {
95 fn clone(&self) -> Self {
96 Self { handler: self.handler.clone(), _service: PhantomData }
97 }
98}
99
100unsafe impl<S, H> Send for ServiceHandlerAdapter<S, H> where H: Send {}
101unsafe impl<S, H> Sync for ServiceHandlerAdapter<S, H> where H: Sync {}
102
103impl<S, H> ServiceHandlerAdapter<S, H> {
104 pub fn from_untyped(handler: H) -> Self {
106 Self { handler, _service: PhantomData }
107 }
108}
109
110impl<S, H, T> ServiceHandler<T> for ServiceHandlerAdapter<S, H>
111where
112 S: DispatchServiceHandler<H, T>,
113{
114 fn on_connection(&self, member: &str, server_end: T) {
115 S::on_connection(&self.handler, member, server_end)
116 }
117}