reactive_graph_plugin_delegates/
relation_instance_manager_impl.rs

1use std::sync::Arc;
2
3use serde_json::Value;
4use uuid::Uuid;
5
6use reactive_graph_behaviour_model_api::BehaviourTypeId;
7use reactive_graph_graph::ComponentTypeId;
8use reactive_graph_graph::Mutability;
9use reactive_graph_graph::RelationInstance;
10use reactive_graph_graph::RelationInstanceId;
11use reactive_graph_graph::RelationTypeId;
12use reactive_graph_reactive_model_impl::ReactiveRelation;
13use reactive_graph_reactive_service_api::ReactiveRelationComponentAddError;
14use reactive_graph_reactive_service_api::ReactiveRelationComponentRemoveError;
15use reactive_graph_reactive_service_api::ReactiveRelationCreationError;
16use reactive_graph_reactive_service_api::ReactiveRelationManager;
17use reactive_graph_reactive_service_api::ReactiveRelationPropertyAddError;
18use reactive_graph_reactive_service_api::ReactiveRelationPropertyRemoveError;
19use reactive_graph_reactive_service_api::ReactiveRelationRegistrationError;
20use reactive_graph_type_system_api::ComponentManager;
21use reactive_graph_type_system_api::RelationTypeManager;
22
23pub struct RelationInstanceManagerDelegate {
24    component_manager: Arc<dyn ComponentManager + Send + Sync>,
25    relation_type_manager: Arc<dyn RelationTypeManager + Send + Sync>,
26    reactive_relation_manager: Arc<dyn ReactiveRelationManager + Send + Sync>,
27}
28
29impl RelationInstanceManagerDelegate {
30    pub fn new(
31        component_manager: Arc<dyn ComponentManager + Send + Sync>,
32        relation_type_manager: Arc<dyn RelationTypeManager + Send + Sync>,
33        reactive_relation_manager: Arc<dyn ReactiveRelationManager + Send + Sync>,
34    ) -> Self {
35        Self {
36            component_manager,
37            relation_type_manager,
38            reactive_relation_manager,
39        }
40    }
41}
42impl reactive_graph_plugin_api::RelationInstanceManager for RelationInstanceManagerDelegate {
43    fn has(&self, relation_instance_id: &RelationInstanceId) -> bool {
44        self.reactive_relation_manager.has(relation_instance_id)
45    }
46
47    fn get(&self, relation_instance_id: &RelationInstanceId) -> Option<ReactiveRelation> {
48        self.reactive_relation_manager.get(relation_instance_id)
49    }
50
51    fn get_by_outbound_entity(&self, outbound_entity_id: Uuid) -> Vec<ReactiveRelation> {
52        self.reactive_relation_manager.get_by_outbound_entity(outbound_entity_id)
53    }
54
55    fn get_by_inbound_entity(&self, inbound_entity_id: Uuid) -> Vec<ReactiveRelation> {
56        self.reactive_relation_manager.get_by_inbound_entity(inbound_entity_id)
57    }
58
59    fn get_all(&self) -> Vec<ReactiveRelation> {
60        self.reactive_relation_manager.get_all()
61    }
62
63    fn get_by_type(&self, ty: &RelationTypeId) -> Vec<ReactiveRelation> {
64        self.reactive_relation_manager.get_by_type(ty)
65    }
66
67    fn get_by_namespace(&self, namespace: &str) -> Vec<ReactiveRelation> {
68        self.reactive_relation_manager.get_by_namespace(namespace)
69    }
70
71    fn get_keys(&self) -> Vec<RelationInstanceId> {
72        self.reactive_relation_manager.get_relation_instance_ids()
73    }
74
75    fn count(&self) -> usize {
76        self.reactive_relation_manager.count()
77    }
78
79    fn count_by_type(&self, ty: &RelationTypeId) -> usize {
80        self.reactive_relation_manager.count_by_type(ty)
81    }
82
83    fn count_by_component(&self, component: &ComponentTypeId) -> usize {
84        self.reactive_relation_manager.count_by_component(component)
85    }
86
87    fn count_by_behaviour(&self, behaviour_ty: &BehaviourTypeId) -> usize {
88        self.reactive_relation_manager.count_by_behaviour(behaviour_ty)
89    }
90
91    fn create(&self, relation_instance: RelationInstance) -> Result<ReactiveRelation, ReactiveRelationCreationError> {
92        let relation_ty = relation_instance.relation_type_id();
93        let relation_type = self.relation_type_manager.get(&relation_ty);
94        // let relation_type = self.relation_type_manager.get_starts_with(&relation_instance.ty);
95        match relation_type {
96            Some(relation_type) => {
97                let id = relation_instance.id();
98                if self.reactive_relation_manager.has(&id) {
99                    if let Some(reactive_relation_instance) = self.reactive_relation_manager.get(&id) {
100                        return Ok(reactive_relation_instance);
101                    }
102                }
103                let relation_instance = relation_instance;
104                // Add properties from relation type if not existing
105                for property in relation_type.properties.iter() {
106                    if !relation_instance.properties.contains_key(property.key()) {
107                        relation_instance.properties.insert(property.key().clone(), property.data_type.default_value());
108                    }
109                }
110                // Add properties from components if not existing
111                for component_ty in relation_type.components.iter() {
112                    if let Some(component) = self.component_manager.get(&component_ty) {
113                        for property in component.properties.iter() {
114                            if !relation_instance.properties.contains_key(property.key()) {
115                                relation_instance.properties.insert(property.key().clone(), property.data_type.default_value());
116                            }
117                        }
118                    }
119                }
120                self.reactive_relation_manager.create_reactive_instance(relation_instance)
121            }
122            None => Err(ReactiveRelationCreationError::UnknownRelationType(relation_ty.clone())),
123        }
124    }
125
126    fn register(&self, reactive_relation: ReactiveRelation) -> Result<ReactiveRelation, ReactiveRelationRegistrationError> {
127        self.reactive_relation_manager.register_reactive_instance(reactive_relation)
128    }
129
130    fn add_component(&self, relation_instance_id: &RelationInstanceId, component: &ComponentTypeId) -> Result<(), ReactiveRelationComponentAddError> {
131        self.reactive_relation_manager.add_component(relation_instance_id, component)
132    }
133
134    fn remove_component(&self, relation_instance_id: &RelationInstanceId, component: &ComponentTypeId) -> Result<(), ReactiveRelationComponentRemoveError> {
135        self.reactive_relation_manager.remove_component(relation_instance_id, component)
136    }
137
138    fn add_property(
139        &self,
140        relation_instance_id: &RelationInstanceId,
141        property_name: &str,
142        mutability: Mutability,
143        value: Value,
144    ) -> Result<(), ReactiveRelationPropertyAddError> {
145        self.reactive_relation_manager
146            .add_property(relation_instance_id, property_name, mutability, value)
147    }
148
149    fn remove_property(&self, relation_instance_id: &RelationInstanceId, property_name: &str) -> Result<(), ReactiveRelationPropertyRemoveError> {
150        self.reactive_relation_manager.remove_property(relation_instance_id, property_name)
151    }
152
153    fn delete(&self, id: &RelationInstanceId) -> bool {
154        self.reactive_relation_manager.delete(id)
155    }
156}