1use crate::router::Router;
2use std::any::TypeId;
3use std::ops::Deref;
4use std::rc::Rc;
5
6pub struct Provided<T> {
24 pub data: Rc<T>,
26}
27
28impl<T> Deref for Provided<T> {
29 type Target = T;
30
31 fn deref(&self) -> &Self::Target {
32 &self.data
33 }
34}
35
36impl<T> Clone for Provided<T> {
37 fn clone(&self) -> Self {
38 Provided {
39 data: Rc::clone(&self.data),
40 }
41 }
42}
43
44impl Router {
45 pub fn provide<T: 'static>(&self, provided: T) {
47 let provided = Provided {
48 data: Rc::new(provided),
49 };
50
51 let type_id = TypeId::of::<Provided<T>>();
52
53 let provided = Box::new(provided);
54
55 self.provided.borrow_mut().insert(type_id, provided);
56 }
57}
58
59#[cfg(test)]
60mod tests {
61 use super::*;
62
63 struct State {
64 count: u8,
65 }
66
67 #[test]
68 fn provide() {
69 let router = Router::new(vec![]);
70 router.provide(State { count: 50 });
71
72 let state = router.provided.borrow();
73 let state = state
74 .get(&TypeId::of::<Provided<State>>())
75 .unwrap()
76 .downcast_ref::<Provided<State>>()
77 .expect("Downcast state");
78
79 assert_eq!(state.count, 50);
80 }
81}