rpc_router/resource/
resources.rs

1use super::resources_inner::ResourcesInner;
2use std::sync::Arc;
3
4// region:    --- Builder
5
6#[derive(Debug, Default, Clone)]
7pub struct ResourcesBuilder {
8	pub(crate) resources_inner: ResourcesInner,
9}
10
11impl ResourcesBuilder {
12	pub fn get<T: Clone + Send + Sync + 'static>(&self) -> Option<T> {
13		self.resources_inner.get().cloned()
14	}
15
16	pub fn append<T: Clone + Send + Sync + 'static>(mut self, val: T) -> Self {
17		self.resources_inner.insert(val);
18		self
19	}
20
21	/// Convenient append method to avoid moving out value.
22	/// Use `.append(val)` if not sure.
23	pub fn append_mut<T: Clone + Send + Sync + 'static>(&mut self, val: T) {
24		self.resources_inner.insert(val);
25	}
26
27	/// Build `Resources` with an `Arc` to enable efficient cloning without
28	/// duplicating the content (i.e., without cloning the type hashmap).
29	pub fn build(self) -> Resources {
30		Resources::from_base_inner(self.resources_inner)
31	}
32}
33
34// endregion: --- Builder
35
36// region:    --- Resources
37
38#[derive(Debug, Clone, Default)]
39pub struct Resources {
40	base_inner: Arc<ResourcesInner>,
41	overlay_inner: Arc<ResourcesInner>,
42}
43
44// -- Builder
45impl Resources {
46	/// Returns a new `ResourcesBuilder`.
47	/// This is equivalent to calling `Resources::default()`.
48	pub fn builder() -> ResourcesBuilder {
49		ResourcesBuilder::default()
50	}
51}
52
53// -- Public Methods
54impl Resources {
55	pub fn get<T: Clone + Send + Sync + 'static>(&self) -> Option<T> {
56		// first additional, then base
57		self.overlay_inner.get::<T>().or_else(|| self.base_inner.get::<T>()).cloned()
58	}
59
60	pub fn is_empty(&self) -> bool {
61		self.base_inner.is_empty() && self.overlay_inner.is_empty()
62	}
63}
64
65// -- Privates
66impl Resources {
67	/// Build a resource from a base_inner ResourcesInner
68	/// This is called bac the ResourcesBuilder
69	pub(crate) fn from_base_inner(base_inner: ResourcesInner) -> Self {
70		Self {
71			base_inner: Arc::new(base_inner),
72			overlay_inner: Default::default(),
73		}
74	}
75
76	pub(crate) fn new_with_overlay(&self, overlay_resources: Resources) -> Self {
77		Self {
78			base_inner: self.base_inner.clone(),
79			overlay_inner: overlay_resources.base_inner.clone(),
80		}
81	}
82}
83
84// endregion: --- Resources