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 #[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 { }