reactive_graph/client/instances/relations/args/
search.rs

1use crate::client::instances::properties::args::parse_property;
2use crate::client::types::components::args::parse_component_ty;
3use crate::client::types::relations::args::type_id::RelationTypeIdOptions;
4use clap::Args;
5use reactive_graph_client::ComponentTypeIds;
6use reactive_graph_client::PropertyInstanceDefinitions;
7use reactive_graph_client::client::instances::relations::variables::search::variables::SearchRelationInstancesVariables;
8use reactive_graph_graph::ComponentTypeId;
9use reactive_graph_graph::PropertyInstances;
10use serde_json::Value;
11use uuid::Uuid;
12
13/// CLI argument for searching relation instances.
14#[derive(Args, Debug, Clone)]
15pub(crate) struct SearchRelationInstancesArgs {
16    /// The id of the outbound entity instance.
17    #[clap(long)]
18    pub outbound_id: Option<Uuid>,
19
20    /// The relation type.
21    #[clap(flatten)]
22    pub ty: RelationTypeIdOptions,
23
24    /// The id of the inbound entity instance.
25    #[clap(short, long)]
26    pub inbound_id: Option<Uuid>,
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 SearchRelationInstancesArgs {
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<&SearchRelationInstancesArgs> for SearchRelationInstancesVariables {
54    fn from(search: &SearchRelationInstancesArgs) -> Self {
55        let ty: Option<reactive_graph_graph::RelationTypeId> = search.ty.clone().into();
56        let properties: PropertyInstanceDefinitions = search.properties().into();
57        let components: ComponentTypeIds = search.components();
58        SearchRelationInstancesVariables::builder()
59            .outbound_id(search.outbound_id.map(From::from))
60            .ty(ty.map(From::from))
61            .inbound_id(search.inbound_id.map(From::from))
62            .properties(Some(properties.0))
63            .components(Some(components.0))
64            .build()
65    }
66}