rpc_router/router/
router_builder.rs

1use crate::handler::RpcHandlerWrapperTrait;
2use crate::router::router_inner::RouterInner;
3use crate::{FromResources, Handler, ResourcesBuilder, ResourcesInner, Router};
4
5#[derive(Debug, Default)]
6pub struct RouterBuilder {
7	inner: RouterInner,
8	base_resources_inner: ResourcesInner,
9}
10
11impl RouterBuilder {
12	/// Add a dyn_handler to the router builder.
13	///
14	/// ```
15	/// RouterBuilder::default().add_dyn("method_name", my_handler_fn.into_dyn());
16	/// ```
17	///
18	/// Note: This is the preferred way to add handlers to the router, as it
19	///       avoids monomorphization of the add function.
20	///       The `RouterInner` also has a `.add()` as a convenience function to just pass the function.
21	///       See `RouterInner::add` for more details.
22	pub fn append_dyn(mut self, name: &'static str, dyn_handler: Box<dyn RpcHandlerWrapperTrait>) -> Self {
23		self.inner.append_dyn(name, dyn_handler);
24		self
25	}
26
27	/// Add a route (name, handler function) to the builder
28	///
29	/// ```
30	/// RouterBuilder::default().add("method_name", my_handler_fn);
31	/// ```
32	///
33	/// Note: This is a convenient add function variant with generics,
34	///       and there will be monomorphed versions of this function
35	///       for each type passed. Use `RouterInner::add_dyn` to avoid this.
36	pub fn append<F, T, P, R>(mut self, name: &'static str, handler: F) -> Self
37	where
38		F: Handler<T, P, R> + Clone + Send + Sync + 'static,
39		T: Send + Sync + 'static,
40		P: Send + Sync + 'static,
41		R: Send + Sync + 'static,
42	{
43		self.inner.append_dyn(name, handler.into_dyn());
44		self
45	}
46
47	/// Extends this builder by consuming another builder.
48	pub fn extend(mut self, other_builder: RouterBuilder) -> Self {
49		self.inner.extend(other_builder.inner);
50		self.base_resources_inner.extend(other_builder.base_resources_inner);
51		self
52	}
53
54	pub fn append_resource<T>(mut self, val: T) -> Self
55	where
56		T: FromResources + Clone + Send + Sync + 'static,
57	{
58		self.base_resources_inner.insert(val);
59		self
60	}
61
62	/// If Some, will extends the current Base Resources with the content of this resources_builder.
63	/// If None, just do nothing.
64	pub fn extend_resources(mut self, resources_builder: Option<ResourcesBuilder>) -> Self {
65		if let Some(resources_builder) = resources_builder {
66			// if self resources empty, no need to extend
67			if self.base_resources_inner.is_empty() {
68				self.base_resources_inner = resources_builder.resources_inner
69			}
70			// if not empty, we extend
71			else {
72				self.base_resources_inner.extend(resources_builder.resources_inner)
73			}
74		}
75		self
76	}
77
78	/// Resets the router's resources with the contents of this ResourcesBuilder.
79	///
80	/// Ensure to call `append_resource` and/or `.extend_resources` afterwards
81	/// if they operation needs to be included.
82	///
83	/// Note: `.extend_resources(Option<ResourcesBuilder>)` is the additive function
84	///        typically used.
85	pub fn set_resources(mut self, resources_builder: ResourcesBuilder) -> Self {
86		self.base_resources_inner = resources_builder.resources_inner;
87		self
88	}
89
90	/// Builds the `RpcRouter` from this builder.
91	/// This is the typical usage, with the `RpcRouter` being encapsulated in an `Arc`,
92	/// indicating it is designed for cloning and sharing across tasks/threads.
93	pub fn build(self) -> Router {
94		Router::new(self.inner, self.base_resources_inner)
95	}
96}