reactive_graph_behaviour_service_impl/
entity_behaviour_registry_impl.rs

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