file_system/
context.rs

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}