reactive_graph_plugin_delegates/
relation_instance_manager_impl.rs1use 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 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 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 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}