reactive_graph_dynamic_graph_impl/object/flow/query/
mod.rs1use crate::extension::divergent::is_divergent;
2use crate::field::flow::flow_id_field;
3use crate::field::flow::flow_property_field;
4use crate::field::instance_component_id_field;
5use crate::interface::flow::INTERFACE_FLOW;
6use crate::object::types::DynamicGraphTypeDefinition;
7use async_graphql::dynamic::Object;
8use async_graphql::dynamic::SchemaBuilder;
9use itertools::Itertools;
10use reactive_graph_dynamic_graph_api::SchemaBuilderContext;
11use reactive_graph_graph::FlowType;
12
13pub fn register_flow_type_query_objects(mut schema: SchemaBuilder, context: &SchemaBuilderContext) -> SchemaBuilder {
14 for flow_type in context.flow_type_manager.get_all().iter() {
15 schema = schema.register(create_flow_type_query_object(flow_type.value(), context));
16 }
17 schema
18}
19
20pub fn create_flow_type_query_object(flow_type: &FlowType, context: &SchemaBuilderContext) -> Object {
21 let dy_ty = DynamicGraphTypeDefinition::from(&flow_type.ty);
22 let mut object = Object::new(dy_ty.to_string()).description(&flow_type.description).implement(INTERFACE_FLOW);
23 object = object.field(flow_id_field());
25 let entity_ty = flow_type.wrapper_type();
32 if let Some(entity_type) = context.entity_type_manager.get(&entity_ty) {
33 for component_ty in entity_type.components.iter() {
35 object = object.field(instance_component_id_field(&component_ty));
36 let component_dy_ty = DynamicGraphTypeDefinition::from(component_ty.key());
37 if !is_divergent(&entity_type, component_ty.key()) {
38 object = object.implement(component_dy_ty.to_string());
39 }
40 }
41 for property_type in entity_type.properties.iter().sorted_by(|a, b| Ord::cmp(&a.key(), &b.key())) {
43 object = object.field(flow_property_field(&property_type));
44 }
45 }
46
47 object
48}