moduforge_state/
gotham_state.rs1use std::any::Any;
2use std::any::TypeId;
3use std::any::type_name;
4use std::sync::Arc;
5
6use dashmap::DashMap;
7
8#[derive(Default, Debug)]
9pub struct GothamState {
10 data: DashMap<TypeId, Arc<dyn Any + Send + Sync>>,
12}
13
14impl GothamState {
15 pub fn put<T: Clone + Send + Sync + 'static>(
20 &self,
21 t: T,
22 ) {
23 let type_id = TypeId::of::<T>();
24 self.data.insert(type_id, Arc::new(t));
25 }
26
27 pub fn has<T: Send + Sync + 'static>(&self) -> bool {
35 let type_id = TypeId::of::<T>();
36 self.data.contains_key(&type_id)
37 }
38 pub fn get<T: Clone + Send + Sync + 'static>(&self) -> Arc<T> {
39 self.try_get::<T>().unwrap_or_else(|| missing::<T>())
40 }
41
42 pub fn try_get<T: Clone + Send + Sync + 'static>(&self) -> Option<Arc<T>> {
43 let type_id = TypeId::of::<T>();
44 if let Some(v) = self.data.get(&type_id) {
45 let value = v.value().clone();
46 Arc::downcast(value).ok()
47 } else {
48 None
49 }
50 }
51
52 pub fn try_take<T: Send + Sync + 'static>(&self) -> Option<Arc<T>> {
53 let type_id = TypeId::of::<T>();
54 match self.data.remove(&type_id) {
55 Some((_, v)) => Arc::downcast(v).ok(),
56 None => None,
57 }
58 }
59 pub fn take<T: Send + Sync + 'static>(&mut self) -> Arc<T> {
67 self.try_take::<T>().unwrap_or_else(|| missing::<T>())
68 }
69}
70
71fn missing<T: 'static>() -> ! {
79 panic!(" 请求的类型 {} 不存在于 GothamState 容器中", type_name::<T>());
80}