reactive_graph_client/client/instances/entities/
mod.rs1use crate::client::error::CommandError;
2use crate::client::error::CommandError::NoContent;
3use crate::client::error::CommandError::NotFound;
4use crate::client::instances::entities::args::EntityInstancesArgs;
5use crate::client::instances::entities::commands::EntityInstancesCommands;
6use crate::client::instances::entities::output_format::EntityInstancesOutputFormatWrapper;
7use crate::client::instances::properties::output_format::PropertyInstancesOutputFormatWrapper;
8use crate::client::result::CommandResult;
9use crate::client::types::components::output_format::ComponentTypeIdsOutputFormatWrapper;
10use reactive_graph_client::ReactiveGraphClient;
11use reactive_graph_graph::ComponentTypeId;
12use reactive_graph_graph::PropertyInstanceGetter;
13use reactive_graph_graph::PropertyType;
14use reactive_graph_table_model::instances::properties::PropertyInstance;
15use std::sync::Arc;
16
17pub(crate) mod args;
18pub(crate) mod commands;
19pub(crate) mod output_format;
20
21pub(crate) async fn entity_instances(client: &Arc<ReactiveGraphClient>, entity_instances_args: EntityInstancesArgs) -> CommandResult {
22 let output_format_wrapper: EntityInstancesOutputFormatWrapper = entity_instances_args.output_format.clone().into();
23 let Some(command) = entity_instances_args.commands else {
24 return Err(CommandError::MissingSubCommand);
25 };
26 match command {
27 EntityInstancesCommands::List(args) => match client.instances().entities().search((&args).into()).await {
28 Ok(Some(entity_instances)) => output_format_wrapper.collection(entity_instances),
29 Ok(None) => Err(NoContent("No entity instances found".to_string())),
30 Err(e) => Err(e.into()),
31 },
32 EntityInstancesCommands::Get(args) => match client.instances().entities().get_entity_instance_by_id(args.clone()).await {
33 Ok(Some(entity_instance)) => output_format_wrapper.single(entity_instance),
34 Ok(None) => Err(args.not_found()),
35 Err(e) => Err(e.into()),
36 },
37 EntityInstancesCommands::GetByLabel(args) => match client.instances().entities().get_entity_instance_by_label(args.label.clone()).await {
38 Ok(Some(entity_instance)) => output_format_wrapper.single(entity_instance),
39 Ok(None) => Err(args.not_found()),
40 Err(e) => Err(e.into()),
41 },
42 EntityInstancesCommands::ListProperties(args) => match client.instances().entities().get_entity_instance_by_id(args.clone()).await {
43 Ok(Some(entity_instance)) => {
44 let output_format_wrapper: PropertyInstancesOutputFormatWrapper = entity_instances_args.output_format.into();
45 let property_instances = entity_instance
46 .properties
47 .iter()
48 .map(|property_instance| PropertyInstance::new(property_instance.key().clone(), property_instance.value().clone()))
49 .collect();
50 output_format_wrapper.collection(property_instances)
51 }
52 Ok(None) => Err(args.not_found()),
53 Err(e) => Err(e.into()),
54 },
55 EntityInstancesCommands::GetProperty(args) => match client.instances().entities().get_entity_instance_by_id(args.id).await {
56 Ok(Some(entity_instance)) => Ok(entity_instance.get(args.property_name.clone()).ok_or(args.property_not_found())?.into()),
57 Ok(None) => Err(args.id_not_found()),
58 Err(e) => Err(e.into()),
59 },
60 EntityInstancesCommands::SetProperty(args) => match client.instances().entities().set_property(args.id, args.name.clone(), args.value.clone()).await {
61 Ok(Some(entity_instance)) => Ok(entity_instance.get(args.name.clone()).ok_or(args.property_not_found())?.into()),
62 Ok(None) => Err(args.id_not_found()),
63 Err(e) => Err(e.into()),
64 },
65 EntityInstancesCommands::AddProperty(args) => {
66 let property_type: PropertyType = args.property_type.clone().into();
67 match client.instances().entities().add_property(args.id, property_type.clone()).await {
68 Ok(Some(entity_instance)) => output_format_wrapper.single(entity_instance),
69 Ok(None) => Err(args.id_not_found()),
70 Err(e) => Err(e.into()),
71 }
72 }
73 EntityInstancesCommands::RemoveProperty(args) => match client.instances().entities().remove_property(args.id, args.property_name.clone()).await {
74 Ok(Some(entity_instance)) => output_format_wrapper.single(entity_instance),
75 Ok(None) => Err(args.id_not_found()),
76 Err(e) => Err(e.into()),
77 },
78 EntityInstancesCommands::ListComponents(args) => match client.instances().entities().get_entity_instance_by_id(args.clone()).await {
79 Ok(Some(entity_instance)) => {
80 let output_format_wrapper: ComponentTypeIdsOutputFormatWrapper = entity_instances_args.output_format.into();
81 let component_tys = entity_instance.components.iter().map(|ty| ty.clone()).collect();
82 output_format_wrapper.collection(component_tys)
83 }
84 Ok(None) => Err(args.not_found()),
85 Err(e) => Err(e.into()),
86 },
87 EntityInstancesCommands::AddComponent(args) => {
88 let component_ty: ComponentTypeId = args.component_ty.clone().into();
89 match client.instances().entities().add_component(args.id, component_ty).await {
90 Ok(Some(entity_instance)) => output_format_wrapper.single(entity_instance),
91 Ok(None) => Err(args.id_not_found()),
92 Err(e) => Err(e.into()),
93 }
94 }
95 EntityInstancesCommands::RemoveComponent(args) => {
96 let component_ty: ComponentTypeId = args.component_ty.clone().into();
97 match client.instances().entities().remove_component(args.id, component_ty).await {
98 Ok(Some(entity_instance)) => output_format_wrapper.single(entity_instance),
99 Ok(None) => Err(args.id_not_found()),
100 Err(e) => Err(e.into()),
101 }
102 }
103 EntityInstancesCommands::Create(args) => match client
104 .instances()
105 .entities()
106 .create(args.ty.clone(), args.id, args.description.clone(), args.properties())
107 .await
108 {
109 Ok(Some(entity_instance)) => output_format_wrapper.single(entity_instance),
110 Ok(None) => Err(NoContent("Entity instance not created".to_string())),
111 Err(e) => Err(e.into()),
112 },
113 EntityInstancesCommands::Delete(args) => match client.instances().entities().delete_entity_instance(args.id).await {
114 Ok(Some(true)) => Ok(format!("Entity instance {} deleted", args.id).into()),
115 Ok(Some(false)) => Ok(format!("Entity instance {} not deleted", args.id).into()),
116 Ok(None) => Err(args.not_found()),
117 Err(e) => Err(e.into()),
118 },
119 EntityInstancesCommands::JsonSchema => match client.json_schema().instances().entities().await {
120 Ok(Some(json_schema)) => Ok(json_schema.into()),
121 Ok(None) => Err(NotFound("JSON Schema not available".to_string())),
122 Err(e) => Err(e.into()),
123 },
124 }
125}