reactive_graph_client/client/instances/entities/args/
search.rs

1use crate::client::instances::properties::args::parse_property;
2use crate::client::types::components::args::parse_component_ty;
3use crate::client::types::entities::args::type_id::EntityTypeIdOptions;
4use clap::Args;
5use reactive_graph_client::ComponentTypeIds;
6use reactive_graph_client::PropertyInstanceDefinitions;
7use reactive_graph_client::client::instances::entities::variables::search::variables::SearchEntityInstancesVariables;
8use reactive_graph_graph::ComponentTypeId;
9use reactive_graph_graph::PropertyInstances;
10use serde_json::Value;
11use uuid::Uuid;
12
13/// CLI argument for searching entity instances.
14#[derive(Args, Debug, Clone)]
15pub(crate) struct SearchEntityInstancesArgs {
16    /// The entity type.
17    #[clap(flatten)]
18    pub ty: EntityTypeIdOptions,
19
20    /// The id of the entity instance.
21    #[clap(short, long)]
22    pub id: Option<Uuid>,
23
24    /// The label of the entity instance.
25    #[clap(short, long)]
26    pub label: Option<String>,
27
28    /// The properties to search for.
29    #[clap(short, long, value_parser = parse_property)]
30    pub properties: Option<Vec<(String, Value)>>,
31
32    /// The components to search for.
33    #[clap(short, long, value_parser = parse_component_ty)]
34    pub components: Option<Vec<ComponentTypeId>>,
35}
36
37impl SearchEntityInstancesArgs {
38    pub fn properties(&self) -> PropertyInstances {
39        match &self.properties {
40            None => PropertyInstances::new(),
41            Some(properties) => properties.iter().map(|(name, value)| (name.clone(), value.clone())).collect(),
42        }
43    }
44
45    pub fn components(&self) -> ComponentTypeIds {
46        match &self.components {
47            None => ComponentTypeIds::new(),
48            Some(components) => ComponentTypeIds(components.iter().map(|ty| ty.clone().into()).collect()),
49        }
50    }
51}
52
53impl From<&SearchEntityInstancesArgs> for SearchEntityInstancesVariables {
54    fn from(search: &SearchEntityInstancesArgs) -> Self {
55        let ty: Option<reactive_graph_graph::EntityTypeId> = search.ty.clone().into();
56        let properties: PropertyInstanceDefinitions = search.properties().into();
57        let components: ComponentTypeIds = search.components();
58        SearchEntityInstancesVariables::builder()
59            .ty(ty.map(From::from))
60            .id(search.id.map(From::from))
61            .label(search.label.clone())
62            .properties(Some(properties.0))
63            .components(Some(components.0))
64            .build()
65    }
66}