teo_runtime/app/
data.rs

1use std::any::Any;
2use std::sync::Arc;
3use deferred_box::DeferredBox;
4use educe::Educe;
5use teo_result::{Result, Error};
6use crate::app::entrance::Entrance;
7use crate::app::runtime_version::RuntimeVersion;
8
9#[derive(Educe, Clone)]
10#[educe(Debug)]
11pub struct AppData {
12    inner: Arc<Inner>,
13}
14
15#[derive(Educe)]
16#[educe(Debug)]
17struct Inner {
18    entrance: Entrance,
19    runtime_version: RuntimeVersion,
20    /// This is designed for Node.js and Python
21    /// A place to store dynamic runtime classes
22    #[educe(Debug(ignore))]
23    dynamic_classes: DeferredBox<Arc<dyn Any>>,
24}
25
26impl AppData {
27
28    pub fn new(entrance: Entrance, runtime_version: RuntimeVersion) -> Self {
29        Self {
30            inner: Arc::new(Inner {
31                entrance,
32                runtime_version,
33                dynamic_classes: DeferredBox::new(),
34            })
35        }
36    }
37
38    pub fn entrance(&self) -> &Entrance {
39        &self.inner.entrance
40    }
41
42    pub fn runtime_version(&self) -> &RuntimeVersion {
43        &self.inner.runtime_version
44    }
45
46    pub fn dynamic_classes(&self) -> Result<&dyn Any> {
47        match self.inner.dynamic_classes.get() {
48            Some(dynamic_classes) => Ok(dynamic_classes.as_ref()),
49            None => Err(Error::new("Dynamic classes is accessed while not set")),
50        }
51    }
52
53    pub fn set_dynamic_classes(&self, dynamic_classes: Arc<dyn Any>) -> Result<()> {
54        match self.inner.dynamic_classes.set(dynamic_classes) {
55            Ok(_) => Ok(()),
56            Err(_) => Err(Error::new("Dynamic classes have been set")),
57        }
58    }
59}
60
61unsafe impl Send for AppData { }
62unsafe impl Sync for AppData { }