reactive_graph_client/client/instances/entities/
api.rs1use std::sync::Arc;
2
3use crate::client::ReactiveGraphClient;
4use crate::client::ReactiveGraphClientExecutionError;
5use crate::client::instances::entities::mutations::add_component::mutations::add_component;
6use crate::client::instances::entities::mutations::add_property::mutations::add_property;
7use crate::client::instances::entities::mutations::create::mutations::create;
8use crate::client::instances::entities::mutations::delete::mutations::delete_entity_instance_mutation;
9use crate::client::instances::entities::mutations::remove_component::mutations::remove_component;
10use crate::client::instances::entities::mutations::remove_property::mutations::remove_property;
11use crate::client::instances::entities::mutations::set_property::mutations::set_property;
12use crate::client::instances::entities::queries::get_by_id::queries::get_entity_instance_by_id;
13use crate::client::instances::entities::queries::get_by_label::queries::get_entity_instance_by_label;
14use crate::client::instances::entities::queries::search::queries::search;
15use crate::client::instances::entities::variables::search::variables::SearchEntityInstancesVariables;
16use cynic::http::ReqwestExt;
17use reactive_graph_graph::ComponentTypeId;
18use reactive_graph_graph::EntityInstance;
19use reactive_graph_graph::EntityTypeId;
20use reactive_graph_graph::PropertyInstances;
21use reactive_graph_graph::PropertyType;
22use serde_json::Value;
23use uuid::Uuid;
24
25pub struct EntityInstances {
26 client: Arc<ReactiveGraphClient>,
27}
28
29impl EntityInstances {
30 pub fn new(client: Arc<ReactiveGraphClient>) -> Self {
31 Self { client }
32 }
33
34 pub async fn search(&self, search_query: SearchEntityInstancesVariables) -> Result<Option<Vec<EntityInstance>>, ReactiveGraphClientExecutionError> {
35 let entity_instances = self
36 .client
37 .client
38 .post(self.client.url_reactive_graph())
39 .run_graphql(search(search_query))
40 .await
41 .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
42 .data
43 .map(|data| crate::schema_graphql::instances::entity_instance::EntityInstances(data.instances.entities))
44 .map(From::from);
45 Ok(entity_instances)
46 }
47
48 pub async fn get_entity_instance_by_id<ID: Into<Uuid>>(&self, id: ID) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
49 let id = id.into();
50 let entity_instance = self
51 .client
52 .client
53 .post(self.client.url_reactive_graph())
54 .run_graphql(get_entity_instance_by_id(id))
55 .await
56 .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
57 .data
58 .and_then(|data| data.instances.entities.first().cloned())
59 .map(From::from);
60 Ok(entity_instance)
61 }
62
63 pub async fn get_entity_instance_by_label<L: Into<String>>(&self, label: L) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
64 let label = label.into();
65 let entity_instance = self
66 .client
67 .client
68 .post(self.client.url_reactive_graph())
69 .run_graphql(get_entity_instance_by_label(label))
70 .await
71 .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
72 .data
73 .and_then(|data| data.instances.entities.first().cloned())
74 .map(From::from);
75 Ok(entity_instance)
76 }
77
78 pub async fn set_property<ID: Into<Uuid>, S: Into<String>, V: Into<Value>>(
79 &self,
80 id: ID,
81 name: S,
82 value: V,
83 ) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
84 let id = id.into();
85 let name = name.into();
86 let value = value.into();
87 let entity_instance = self
88 .client
89 .client
90 .post(self.client.url_reactive_graph())
91 .run_graphql(set_property(id, name, value))
92 .await
93 .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
94 .data
95 .map(|data| data.instances.entities.update)
96 .map(From::from);
97 Ok(entity_instance)
98 }
99
100 pub async fn add_property<ID: Into<Uuid>, PT: Into<PropertyType>>(
101 &self,
102 id: ID,
103 property_type: PT,
104 ) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
105 let id = id.into();
106 let property_type = property_type.into();
107 let entity_instance = self
108 .client
109 .client
110 .post(self.client.url_reactive_graph())
111 .run_graphql(add_property(id, property_type))
112 .await
113 .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
114 .data
115 .map(|data| data.instances.entities.update)
116 .map(From::from);
117 Ok(entity_instance)
118 }
119
120 pub async fn remove_property<ID: Into<Uuid>, S: Into<String>>(
121 &self,
122 id: ID,
123 property_name: S,
124 ) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
125 let id = id.into();
126 let property_name = property_name.into();
127 let entity_instance = self
128 .client
129 .client
130 .post(self.client.url_reactive_graph())
131 .run_graphql(remove_property(id, property_name))
132 .await
133 .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
134 .data
135 .map(|data| data.instances.entities.update)
136 .map(From::from);
137 Ok(entity_instance)
138 }
139
140 pub async fn add_component<ID: Into<Uuid>, C: Into<ComponentTypeId>>(
141 &self,
142 id: ID,
143 component_ty: C,
144 ) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
145 let id = id.into();
146 let component_ty = component_ty.into();
147 let entity_instance = self
148 .client
149 .client
150 .post(self.client.url_reactive_graph())
151 .run_graphql(add_component(id, component_ty))
152 .await
153 .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
154 .data
155 .map(|data| data.instances.entities.update)
156 .map(From::from);
157 Ok(entity_instance)
158 }
159
160 pub async fn remove_component<ID: Into<Uuid>, C: Into<ComponentTypeId>>(
161 &self,
162 id: ID,
163 component_ty: C,
164 ) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
165 let id = id.into();
166 let component_ty = component_ty.into();
167 let entity_instance = self
168 .client
169 .client
170 .post(self.client.url_reactive_graph())
171 .run_graphql(remove_component(id, component_ty))
172 .await
173 .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
174 .data
175 .map(|data| data.instances.entities.update)
176 .map(From::from);
177 Ok(entity_instance)
178 }
179
180 pub async fn create<TY: Into<EntityTypeId>, ID: Into<Uuid>>(
181 &self,
182 ty: TY,
183 id: Option<ID>,
184 description: Option<String>,
185 properties: PropertyInstances,
186 ) -> Result<Option<EntityInstance>, ReactiveGraphClientExecutionError> {
187 let ty = ty.into();
188 let id = id.map(|id| id.into());
189 let entity_instance = self
190 .client
191 .client
192 .post(self.client.url_reactive_graph())
193 .run_graphql(create(ty, id, description, properties))
194 .await
195 .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
196 .data
197 .map(|data| data.instances.entities.create)
198 .map(From::from);
199 Ok(entity_instance)
200 }
201
202 pub async fn delete_entity_instance<ID: Into<Uuid>>(&self, id: ID) -> Result<Option<bool>, ReactiveGraphClientExecutionError> {
203 let id = id.into();
204 let entity_instance = self
205 .client
206 .client
207 .post(self.client.url_reactive_graph())
208 .run_graphql(delete_entity_instance_mutation(id))
209 .await
210 .map_err(ReactiveGraphClientExecutionError::FailedToSendRequest)?
211 .data
212 .map(|data| data.instances.entities.delete);
213 Ok(entity_instance)
214 }
215}