reactive_graph_std_object/
plugin.rs

1use reactive_graph_plugin_api::EntityBehaviourRegistry;
2use reactive_graph_plugin_api::prelude::plugin::*;
3use reactive_graph_plugin_api::prelude::providers::*;
4
5use crate::behaviour::entity::get_property::ObjectGetPropertyFactory;
6use crate::behaviour::entity::keys::ObjectKeysFactory;
7use crate::behaviour::entity::remove_property::ObjectRemovePropertyFactory;
8use crate::behaviour::entity::set_property::ObjectSetPropertyFactory;
9use reactive_graph_std_object_model::BEHAVIOUR_OBJECT_GET_PROPERTY;
10use reactive_graph_std_object_model::BEHAVIOUR_OBJECT_KEYS;
11use reactive_graph_std_object_model::BEHAVIOUR_OBJECT_REMOVE_PROPERTY;
12use reactive_graph_std_object_model::BEHAVIOUR_OBJECT_SET_PROPERTY;
13use reactive_graph_std_object_model::ENTITY_BEHAVIOUR_OBJECT_GET_PROPERTY;
14use reactive_graph_std_object_model::ENTITY_BEHAVIOUR_OBJECT_KEYS;
15use reactive_graph_std_object_model::ENTITY_BEHAVIOUR_OBJECT_REMOVE_PROPERTY;
16use reactive_graph_std_object_model::ENTITY_BEHAVIOUR_OBJECT_SET_PROPERTY;
17
18export_plugin!({
19    "dependencies": [
20        { "name": "reactive-graph-std-base", "version": ">=0.10.0, <0.11.0" },
21        { "name": "reactive-graph-std-result", "version": ">=0.10.0, <0.11.0" },
22        { "name": "reactive-graph-std-trigger", "version": ">=0.10.0, <0.11.0" }
23    ]
24});
25
26#[injectable]
27pub trait ObjectPlugin: Plugin + Send + Sync {}
28
29#[derive(Component)]
30pub struct ObjectPluginImpl {
31    entity_types_provider: Arc<dyn TypeProvider<EntityTypes> + Send + Sync>,
32
33    #[component(default = "entity_types_provider_registry")]
34    entity_type_provider_registry: Arc<dyn EntityTypeProviderRegistry + Send + Sync>,
35
36    #[component(default = "entity_behaviour_registry")]
37    entity_behaviour_registry: Arc<dyn EntityBehaviourRegistry + Send + Sync>,
38}
39
40#[async_trait]
41#[component_alias]
42impl Plugin for ObjectPluginImpl {
43    async fn activate(&self) -> Result<(), PluginActivationError> {
44        self.entity_type_provider_registry.register_provider(self.entity_types_provider.clone()).await;
45
46        // Object Get Property
47        let factory = Arc::new(ObjectGetPropertyFactory::new(BEHAVIOUR_OBJECT_GET_PROPERTY.clone()));
48        self.entity_behaviour_registry
49            .register(ENTITY_BEHAVIOUR_OBJECT_GET_PROPERTY.clone(), factory)
50            .await;
51
52        // Object Keys
53        let factory = Arc::new(ObjectKeysFactory::new(BEHAVIOUR_OBJECT_KEYS.clone()));
54        self.entity_behaviour_registry.register(ENTITY_BEHAVIOUR_OBJECT_KEYS.clone(), factory).await;
55
56        // Object Remove Property
57        let factory = Arc::new(ObjectRemovePropertyFactory::new(BEHAVIOUR_OBJECT_REMOVE_PROPERTY.clone()));
58        self.entity_behaviour_registry
59            .register(ENTITY_BEHAVIOUR_OBJECT_REMOVE_PROPERTY.clone(), factory)
60            .await;
61
62        // Object Set Property
63        let factory = Arc::new(ObjectSetPropertyFactory::new(BEHAVIOUR_OBJECT_SET_PROPERTY.clone()));
64        self.entity_behaviour_registry
65            .register(ENTITY_BEHAVIOUR_OBJECT_SET_PROPERTY.clone(), factory)
66            .await;
67
68        Ok(())
69    }
70
71    async fn deactivate(&self) -> Result<(), PluginDeactivationError> {
72        self.entity_behaviour_registry.unregister(&ENTITY_BEHAVIOUR_OBJECT_GET_PROPERTY).await;
73        self.entity_behaviour_registry.unregister(&ENTITY_BEHAVIOUR_OBJECT_KEYS).await;
74        self.entity_behaviour_registry.unregister(&ENTITY_BEHAVIOUR_OBJECT_REMOVE_PROPERTY).await;
75        self.entity_behaviour_registry.unregister(&ENTITY_BEHAVIOUR_OBJECT_SET_PROPERTY).await;
76
77        self.entity_type_provider_registry.unregister_provider(self.entity_types_provider.id()).await;
78        Ok(())
79    }
80}