1use core::any::Any;
2
3use alloc::boxed::Box;
4
5pub struct Context {
6 private_data: Option<Box<dyn Any + Send + Sync>>,
7}
8
9impl Context {
10 pub fn new<T: 'static + Send + Sync>(private_data: Option<T>) -> Self {
11 Self {
12 private_data: private_data.map(|data| Box::new(data) as Box<dyn Any + Send + Sync>),
13 }
14 }
15
16 pub fn new_empty() -> Self {
17 Self { private_data: None }
18 }
19
20 pub fn get_private_data(&mut self) -> Option<&mut Box<dyn Any + Send + Sync>> {
21 self.private_data.as_mut()
22 }
23
24 pub fn get_private_data_mutable_of_type<T: 'static>(&mut self) -> Option<&mut T> {
25 self.private_data.as_mut()?.downcast_mut::<T>()
26 }
27
28 pub fn get_private_data_of_type<T: 'static>(&self) -> Option<&T> {
29 self.private_data.as_ref()?.downcast_ref::<T>()
30 }
31
32 pub fn take_private_data(&mut self) -> Option<Box<dyn Any + Send + Sync>> {
33 self.private_data.take()
34 }
35
36 pub fn take_private_data_of_type<T: 'static>(&mut self) -> Option<Box<T>> {
37 if self.private_data.as_ref()?.is::<T>() {
38 let data = self.private_data.take()?;
39 Some(data.downcast::<T>().ok()?)
40 } else {
41 None
42 }
43 }
44
45 pub fn set_private_data(&mut self, data: Box<dyn Any + Send + Sync>) {
46 self.private_data = Some(data);
47 }
48}