reactive_graph_std_arithmetic/
plugin.rs

1use crate::behaviour::entity::counter::CounterFactory;
2use crate::behaviour::entity::gate::function::ARITHMETIC_GATES_F64;
3use crate::behaviour::entity::gate::function::ARITHMETIC_GATES_I64;
4use crate::behaviour::entity::gate::function::ARITHMETIC_GATES_U64;
5use crate::behaviour::entity::operation::function::ARITHMETIC_OPERATIONS_F64;
6use crate::behaviour::entity::operation::function::ARITHMETIC_OPERATIONS_I64;
7use crate::behaviour::entity::operation::function::ARITHMETIC_OPERATIONS_U64;
8use reactive_graph_plugin_api::EntityBehaviourRegistry;
9use reactive_graph_plugin_api::prelude::plugin::*;
10use reactive_graph_plugin_api::prelude::providers::*;
11use reactive_graph_std_arithmetic_model::BEHAVIOUR_COUNTER;
12use reactive_graph_std_arithmetic_model::ENTITY_BEHAVIOUR_COUNTER;
13
14export_plugin!({
15    "dependencies": [
16        { "name": "reactive-graph-std-base", "version": ">=0.10.0, <0.11.0" }
17        { "name": "reactive-graph-std-trigger", "version": ">=0.10.0, <0.11.0" }
18        { "name": "reactive-graph-std-result", "version": ">=0.10.0, <0.11.0" }
19    ]
20});
21
22#[injectable]
23pub trait ArithmeticPlugin: Plugin + Send + Sync {}
24
25#[derive(Component)]
26pub struct ArithmeticPluginImpl {
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
41#[async_trait]
42#[component_alias]
43impl Plugin for ArithmeticPluginImpl {
44    async fn activate(&self) -> Result<(), PluginActivationError> {
45        self.component_provider_registry.register_provider(self.component_provider.clone()).await;
46        self.entity_type_provider_registry.register_provider(self.entity_types_provider.clone()).await;
47        self.entity_behaviour_registry.register_all(&ARITHMETIC_OPERATIONS_F64.get_factories()).await;
48        self.entity_behaviour_registry.register_all(&ARITHMETIC_OPERATIONS_I64.get_factories()).await;
49        self.entity_behaviour_registry.register_all(&ARITHMETIC_OPERATIONS_U64.get_factories()).await;
50        self.entity_behaviour_registry.register_all(&ARITHMETIC_GATES_F64.get_factories()).await;
51        self.entity_behaviour_registry.register_all(&ARITHMETIC_GATES_I64.get_factories()).await;
52        self.entity_behaviour_registry.register_all(&ARITHMETIC_GATES_U64.get_factories()).await;
53        self.entity_behaviour_registry
54            .register(ENTITY_BEHAVIOUR_COUNTER.clone(), Arc::new(CounterFactory::new(BEHAVIOUR_COUNTER.clone())))
55            .await;
56        Ok(())
57    }
58
59    async fn deactivate(&self) -> Result<(), PluginDeactivationError> {
60        self.entity_behaviour_registry.unregister(&ENTITY_BEHAVIOUR_COUNTER).await;
61        self.entity_behaviour_registry
62            .unregister_all(&ARITHMETIC_GATES_U64.to_entity_behaviour_tys())
63            .await;
64        self.entity_behaviour_registry
65            .unregister_all(&ARITHMETIC_GATES_I64.to_entity_behaviour_tys())
66            .await;
67        self.entity_behaviour_registry
68            .unregister_all(&ARITHMETIC_GATES_F64.to_entity_behaviour_tys())
69            .await;
70        self.entity_behaviour_registry
71            .unregister_all(&ARITHMETIC_OPERATIONS_U64.to_entity_behaviour_tys())
72            .await;
73        self.entity_behaviour_registry
74            .unregister_all(&ARITHMETIC_OPERATIONS_I64.to_entity_behaviour_tys())
75            .await;
76        self.entity_behaviour_registry
77            .unregister_all(&ARITHMETIC_OPERATIONS_F64.to_entity_behaviour_tys())
78            .await;
79        self.entity_type_provider_registry.unregister_provider(self.entity_types_provider.id()).await;
80        self.component_provider_registry.unregister_provider(self.component_provider.id()).await;
81        Ok(())
82    }
83}