reactive_graph_client/client/instances/entities/
mod.rs

1use 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}