reactive_graph_std_date_time/
plugin.rs

1use reactive_graph_plugin_api::EntityBehaviourRegistry;
2use reactive_graph_plugin_api::prelude::plugin::*;
3use reactive_graph_plugin_api::prelude::providers::*;
4
5use reactive_graph_std_date_time_model::BEHAVIOUR_UTC_NOW;
6use reactive_graph_std_date_time_model::BEHAVIOUR_UTC_TIMESTAMP;
7use reactive_graph_std_date_time_model::ENTITY_BEHAVIOUR_UTC_NOW;
8use reactive_graph_std_date_time_model::ENTITY_BEHAVIOUR_UTC_TIMESTAMP;
9
10use crate::api::TimeGraph;
11use crate::behaviour::UtcNowFactory;
12use crate::behaviour::UtcTimestampFactory;
13
14export_plugin!({
15    "dependencies": [
16        { "name": "reactive-graph-std-base", "version": ">=0.10.0, <0.11.0" },
17        { "name": "reactive-graph-std-result", "version": ">=0.10.0, <0.11.0" },
18        { "name": "reactive-graph-std-trigger", "version": ">=0.10.0, <0.11.0" }
19    ]
20});
21
22#[injectable]
23pub trait DateTimePlugin: Plugin + Send + Sync {}
24
25#[derive(Component)]
26pub struct DateTimePluginImpl {
27    component_provider: Arc<dyn TypeProvider<Components> + Send + Sync>,
28
29    #[component(default = "component_provider_registry")]
30    component_provider_registry: Arc<dyn ComponentProviderRegistry + Send + Sync>,
31
32    entity_types_provider: Arc<dyn TypeProvider<EntityTypes> + Send + Sync>,
33
34    #[component(default = "entity_types_provider_registry")]
35    entity_type_provider_registry: Arc<dyn EntityTypeProviderRegistry + Send + Sync>,
36
37    #[component(default = "entity_behaviour_registry")]
38    entity_behaviour_registry: Arc<dyn EntityBehaviourRegistry + Send + Sync>,
39
40    relation_types_provider: Arc<dyn TypeProvider<RelationTypes> + Send + Sync>,
41
42    #[component(default = "relation_types_provider_registry")]
43    relation_type_provider_registry: Arc<dyn RelationTypeProviderRegistry + Send + Sync>,
44
45    time_graph: Arc<dyn TimeGraph + Send + Sync>,
46}
47
48#[async_trait]
49#[component_alias]
50impl Plugin for DateTimePluginImpl {
51    async fn activate(&self) -> Result<(), PluginActivationError> {
52        self.component_provider_registry.register_provider(self.component_provider.clone()).await;
53        self.entity_type_provider_registry.register_provider(self.entity_types_provider.clone()).await;
54        self.relation_type_provider_registry
55            .register_provider(self.relation_types_provider.clone())
56            .await;
57        // Utc Timestamp
58        let factory = Arc::new(UtcTimestampFactory::new(BEHAVIOUR_UTC_TIMESTAMP.clone()));
59        self.entity_behaviour_registry.register(ENTITY_BEHAVIOUR_UTC_TIMESTAMP.clone(), factory).await;
60        // Utc Now
61        let factory = Arc::new(UtcNowFactory::new(BEHAVIOUR_UTC_NOW.clone()));
62        self.entity_behaviour_registry.register(ENTITY_BEHAVIOUR_UTC_NOW.clone(), factory).await;
63
64        self.time_graph.init().await;
65
66        let time_graph = self.time_graph.clone();
67
68        async_std::task::spawn(async move {
69            time_graph.init().await;
70        });
71
72        Ok(())
73    }
74
75    async fn deactivate(&self) -> Result<(), PluginDeactivationError> {
76        self.time_graph.shutdown().await;
77
78        self.entity_behaviour_registry.unregister(&ENTITY_BEHAVIOUR_UTC_TIMESTAMP).await;
79        self.entity_behaviour_registry.unregister(&ENTITY_BEHAVIOUR_UTC_NOW).await;
80
81        self.relation_type_provider_registry
82            .unregister_provider(self.relation_types_provider.id())
83            .await;
84        self.entity_type_provider_registry.unregister_provider(self.entity_types_provider.id()).await;
85        self.component_provider_registry.unregister_provider(self.component_provider.id()).await;
86        Ok(())
87    }
88}