dcl_rpc/
service_module_definition.rs1use crate::{rpc_protocol::RemoteError, stream_protocol::Generator};
7use core::future::Future;
8use std::{collections::HashMap, pin::Pin, sync::Arc};
9
10pub struct ProcedureContext<Context> {
12 pub server_context: Arc<Context>,
14 pub transport_id: u32,
16}
17
18pub type Response<T> = Pin<Box<dyn Future<Output = Result<T, RemoteError>> + Send>>;
20
21pub type CommonPayload = Vec<u8>;
23
24pub type UnaryResponse = Response<Vec<u8>>;
26
27pub type UnaryRequestHandler<Context> =
29 dyn Fn(CommonPayload, ProcedureContext<Context>) -> UnaryResponse + Send + Sync;
30
31pub type ServerStreamsResponse = Response<Generator<Vec<u8>>>;
33
34pub type ServerStreamsRequestHandler<Context> =
36 dyn Fn(CommonPayload, ProcedureContext<Context>) -> ServerStreamsResponse + Send + Sync;
37
38pub type ClientStreamsPayload = Generator<Vec<u8>>;
40
41pub type ClientStreamsResponse = Response<Vec<u8>>;
43
44pub type ClientStreamsRequestHandler<Context> =
46 dyn Fn(ClientStreamsPayload, ProcedureContext<Context>) -> ClientStreamsResponse + Send + Sync;
47
48pub type BiStreamsPayload = Generator<Vec<u8>>;
50
51pub type BiStreamsResponse = Response<Generator<Vec<u8>>>;
53
54pub type BiStreamsRequestHandler<Context> =
56 dyn Fn(BiStreamsPayload, ProcedureContext<Context>) -> BiStreamsResponse + Send + Sync;
57
58pub enum ProcedureDefinition<Context> {
60 Unary(Arc<UnaryRequestHandler<Context>>),
62 ServerStreams(Arc<ServerStreamsRequestHandler<Context>>),
64 ClientStreams(Arc<ClientStreamsRequestHandler<Context>>),
66 BiStreams(Arc<BiStreamsRequestHandler<Context>>),
68}
69
70impl<Context> Clone for ProcedureDefinition<Context> {
71 fn clone(&self) -> Self {
72 match self {
73 Self::Unary(procedure) => Self::Unary(procedure.clone()),
74 Self::ServerStreams(procedure) => Self::ServerStreams(procedure.clone()),
75 Self::ClientStreams(procedure) => Self::ClientStreams(procedure.clone()),
76 Self::BiStreams(procedure) => Self::BiStreams(procedure.clone()),
77 }
78 }
79}
80
81pub struct ServiceModuleDefinition<Context> {
83 procedure_definitions: HashMap<String, ProcedureDefinition<Context>>,
88}
89
90impl<Context> ServiceModuleDefinition<Context> {
91 pub fn new() -> Self {
92 Self {
93 procedure_definitions: HashMap::new(),
94 }
95 }
96
97 pub fn add_unary<
99 H: Fn(CommonPayload, ProcedureContext<Context>) -> UnaryResponse + Send + Sync + 'static,
100 >(
101 &mut self,
102 name: &str,
103 handler: H,
104 ) {
105 self.add_definition(name, ProcedureDefinition::Unary(Arc::new(handler)));
106 }
107
108 pub fn add_server_streams<
110 H: Fn(CommonPayload, ProcedureContext<Context>) -> ServerStreamsResponse
111 + Send
112 + Sync
113 + 'static,
114 >(
115 &mut self,
116 name: &str,
117 handler: H,
118 ) {
119 self.add_definition(name, ProcedureDefinition::ServerStreams(Arc::new(handler)));
120 }
121
122 pub fn add_client_streams<
124 H: Fn(ClientStreamsPayload, ProcedureContext<Context>) -> ClientStreamsResponse
125 + Send
126 + Sync
127 + 'static,
128 >(
129 &mut self,
130 name: &str,
131 handler: H,
132 ) {
133 self.add_definition(name, ProcedureDefinition::ClientStreams(Arc::new(handler)));
134 }
135
136 pub fn add_bidir_streams<
138 H: Fn(BiStreamsPayload, ProcedureContext<Context>) -> BiStreamsResponse
139 + Send
140 + Sync
141 + 'static,
142 >(
143 &mut self,
144 name: &str,
145 handler: H,
146 ) {
147 self.add_definition(name, ProcedureDefinition::BiStreams(Arc::new(handler)));
148 }
149
150 fn add_definition(&mut self, name: &str, definition: ProcedureDefinition<Context>) {
151 self.procedure_definitions
152 .insert(name.to_string(), definition);
153 }
154
155 pub fn get_definitions(&self) -> &HashMap<String, ProcedureDefinition<Context>> {
156 &self.procedure_definitions
157 }
158}
159
160impl<Context> Default for ServiceModuleDefinition<Context> {
161 fn default() -> Self {
162 Self::new()
163 }
164}