reactive_graph_std_numeric/
plugin.rs

1use crate::api::numeric_constants_factory::NumericConstantsFactory;
2use crate::behaviour::entity::gate::function::NUMERIC_GATES_F64;
3use crate::behaviour::entity::operation::function::NUMERIC_OPERATIONS_F64;
4use crate::behaviour::entity::operation::function::NUMERIC_OPERATIONS_I64;
5use reactive_graph_plugin_api::EntityBehaviourRegistry;
6use reactive_graph_plugin_api::prelude::plugin::*;
7use reactive_graph_plugin_api::prelude::providers::*;
8
9export_plugin!({
10    "dependencies": [
11        { "name": "reactive-graph-std-base", "version": ">=0.10.0, <0.11.0" }
12        { "name": "reactive-graph-std-trigger", "version": ">=0.10.0, <0.11.0" }
13        { "name": "reactive-graph-std-result", "version": ">=0.10.0, <0.11.0" }
14    ]
15});
16
17#[injectable]
18pub trait NumericPlugin: Plugin + Send + Sync {}
19
20#[derive(Component)]
21pub struct NumericPluginImpl {
22    component_provider: Arc<dyn TypeProvider<Components> + Send + Sync>,
23
24    #[component(default = "component_provider_registry")]
25    component_provider_registry: Arc<dyn ComponentProviderRegistry + Send + Sync>,
26
27    entity_types_provider: Arc<dyn TypeProvider<EntityTypes> + Send + Sync>,
28
29    #[component(default = "entity_types_provider_registry")]
30    entity_type_provider_registry: Arc<dyn EntityTypeProviderRegistry + Send + Sync>,
31
32    #[component(default = "entity_behaviour_registry")]
33    entity_behaviour_registry: Arc<dyn EntityBehaviourRegistry + Send + Sync>,
34
35    numeric_constants_factory: Arc<dyn NumericConstantsFactory + Send + Sync>,
36}
37
38#[async_trait]
39#[component_alias]
40impl Plugin for NumericPluginImpl {
41    async fn activate(&self) -> Result<(), PluginActivationError> {
42        self.component_provider_registry.register_provider(self.component_provider.clone()).await;
43        self.entity_type_provider_registry.register_provider(self.entity_types_provider.clone()).await;
44        self.entity_behaviour_registry.register_all(&NUMERIC_OPERATIONS_F64.get_factories()).await;
45        self.entity_behaviour_registry.register_all(&NUMERIC_OPERATIONS_I64.get_factories()).await;
46        self.entity_behaviour_registry.register_all(&NUMERIC_GATES_F64.get_factories()).await;
47        self.numeric_constants_factory.create_numeric_constants().await;
48        Ok(())
49    }
50
51    async fn deactivate(&self) -> Result<(), PluginDeactivationError> {
52        self.entity_behaviour_registry
53            .unregister_all(&NUMERIC_GATES_F64.to_entity_behaviour_tys())
54            .await;
55        self.entity_behaviour_registry
56            .unregister_all(&NUMERIC_OPERATIONS_I64.to_entity_behaviour_tys())
57            .await;
58        self.entity_behaviour_registry
59            .unregister_all(&NUMERIC_OPERATIONS_F64.to_entity_behaviour_tys())
60            .await;
61        self.entity_type_provider_registry.unregister_provider(self.entity_types_provider.id()).await;
62        self.component_provider_registry.unregister_provider(self.component_provider.id()).await;
63        Ok(())
64    }
65}