reactive_graph_behaviour_service_impl/
relation_component_behaviour_registry_impl.rs

1use std::sync::Arc;
2
3use async_trait::async_trait;
4use dashmap::DashMap;
5use log::debug;
6use log::warn;
7use springtime_di::Component;
8use springtime_di::component_alias;
9
10use reactive_graph_behaviour_model_api::prelude::*;
11use reactive_graph_behaviour_service_api::RelationComponentBehaviourRegistry;
12use reactive_graph_graph::ComponentTypeId;
13use reactive_graph_graph::RelationInstanceId;
14use reactive_graph_lifecycle::Lifecycle;
15use reactive_graph_reactive_model_impl::ReactiveRelation;
16use reactive_graph_type_system_api::ComponentManager;
17
18#[derive(Component)]
19pub struct RelationComponentBehaviourRegistryImpl {
20    component_manager: Arc<dyn ComponentManager + Send + Sync>,
21
22    #[component(default = "DashMap::new")]
23    factories: DashMap<ComponentBehaviourTypeId, Arc<dyn BehaviourFactory<RelationInstanceId, ReactiveRelation> + Send + Sync>>,
24}
25
26#[async_trait]
27#[component_alias]
28impl RelationComponentBehaviourRegistry for RelationComponentBehaviourRegistryImpl {
29    fn register(
30        &self,
31        component_behaviour_ty: ComponentBehaviourTypeId,
32        factory: Arc<dyn BehaviourFactory<RelationInstanceId, ReactiveRelation> + Send + Sync>,
33    ) {
34        debug!(
35            "Registering relation component behaviour {} {}",
36            &component_behaviour_ty.component_ty, &component_behaviour_ty.behaviour_ty
37        );
38        if !self.component_manager.has(&component_behaviour_ty.component_ty) {
39            warn!(
40                "Relation component behaviour {} is registered on a non-existent component {}",
41                &component_behaviour_ty.behaviour_ty, &component_behaviour_ty.component_ty
42            )
43        }
44        self.factories.insert(component_behaviour_ty, factory);
45    }
46
47    fn unregister(&self, component_behaviour_ty: &ComponentBehaviourTypeId) {
48        debug!(
49            "Unregistering relation component behaviour {} {}",
50            &component_behaviour_ty.component_ty, &component_behaviour_ty.behaviour_ty
51        );
52        self.factories.remove(component_behaviour_ty);
53    }
54
55    fn get_all(&self) -> Vec<ComponentBehaviourTypeId> {
56        self.factories.iter().map(|f| f.key().clone()).collect()
57    }
58
59    fn get(&self, component_ty: &ComponentTypeId) -> Vec<Arc<dyn BehaviourFactory<RelationInstanceId, ReactiveRelation> + Send + Sync>> {
60        self.factories
61            .iter()
62            .filter(|factory| &factory.key().component_ty == component_ty)
63            .map(|factory| factory.value().clone())
64            .collect()
65    }
66
67    fn get_behaviour_types(&self, component_ty: &ComponentTypeId) -> Vec<ComponentBehaviourTypeId> {
68        self.factories
69            .iter()
70            .filter(|factory| &factory.key().component_ty == component_ty)
71            .map(|factory| factory.key().clone())
72            .collect()
73    }
74
75    fn get_by_behaviour_type(&self, behaviour_ty: &BehaviourTypeId) -> Option<ComponentBehaviourTypeId> {
76        self.factories
77            .iter()
78            .find(|factory| &factory.key().behaviour_ty == behaviour_ty)
79            .map(|factory| factory.key().clone())
80    }
81
82    fn count(&self) -> usize {
83        self.factories.len()
84    }
85}
86
87#[async_trait]
88impl Lifecycle for RelationComponentBehaviourRegistryImpl {}