reactive_graph_behaviour_service_impl/
entity_behaviour_registry_impl.rs1use 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 {}