reactive_graph_dynamic_graph_impl/object/flow/query/
mod.rs

1use 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    // ID field
24    object = object.field(flow_id_field());
25    // wrapper entity instance
26    // entities
27    // relations
28    // variables
29
30    // Only applicable if the entity type of the flow type actually exists
31    let entity_ty = flow_type.wrapper_type();
32    if let Some(entity_type) = context.entity_type_manager.get(&entity_ty) {
33        // Components
34        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        // Property Fields
42        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}