reactive_graph_dynamic_graph_impl/field/
component.rs

1use std::sync::Arc;
2
3use async_graphql::ID;
4use async_graphql::dynamic::Field;
5use async_graphql::dynamic::FieldFuture;
6use async_graphql::dynamic::FieldValue;
7use async_graphql::dynamic::InterfaceField;
8use async_graphql::dynamic::TypeRef;
9
10use crate::field::to_type_ref;
11use crate::object::types::DynamicGraphTypeDefinition;
12use reactive_graph_graph::Component;
13use reactive_graph_graph::ComponentTypeId;
14use reactive_graph_graph::PropertyType;
15use reactive_graph_reactive_model_impl::ReactiveEntity;
16use reactive_graph_reactive_model_impl::ReactiveRelation;
17use reactive_graph_reactive_service_api::ReactiveEntityManager;
18use reactive_graph_reactive_service_api::ReactiveRelationManager;
19
20pub fn component_query_field(component: &Component) -> Field {
21    let ty = component.ty.clone();
22    let dy_ty = DynamicGraphTypeDefinition::from(&ty);
23    Field::new(dy_ty.field_name_with_suffix(), TypeRef::named_nn_list_nn(dy_ty.to_string()), move |ctx| {
24        let ty = ty.clone();
25        FieldFuture::new(async move {
26            let entity_instance_manager = ctx.data::<Arc<dyn ReactiveEntityManager + Send + Sync>>()?;
27            let relation_instance_manager = ctx.data::<Arc<dyn ReactiveRelationManager + Send + Sync>>()?;
28            let entity_instances = entity_instance_manager.get_by_component(&ty).into_iter().map(entity_instance_component);
29            let relation_instances = relation_instance_manager.get_by_component(&ty).into_iter().map(relation_instance_component);
30            let field_values = entity_instances.chain(relation_instances);
31            Ok(Some(FieldValue::list(field_values)))
32        })
33    })
34    .description(component.description.clone())
35}
36
37fn entity_instance_component<'a>(entity_instance: ReactiveEntity) -> FieldValue<'a> {
38    let dy_ty = DynamicGraphTypeDefinition::from(&entity_instance.ty);
39    FieldValue::owned_any(entity_instance).with_type(dy_ty.to_string())
40}
41
42fn relation_instance_component<'a>(relation_instance: ReactiveRelation) -> FieldValue<'a> {
43    let dy_ty = DynamicGraphTypeDefinition::from(&relation_instance.relation_type_id());
44    FieldValue::owned_any(relation_instance).with_type(dy_ty.to_string())
45}
46
47pub fn instance_component_id_field(ty: &ComponentTypeId) -> Field {
48    let ty_inner = ty.clone();
49    Field::new(format!("_{ty}"), TypeRef::named(TypeRef::ID), move |_ctx| {
50        let ty = ty_inner.clone();
51        FieldFuture::new(async move {
52            let dy_ty = DynamicGraphTypeDefinition::from(&ty);
53            Ok(Some(FieldValue::value(ID(dy_ty.to_string()))))
54        })
55    })
56}
57
58pub fn component_property_field(property_type: &PropertyType) -> InterfaceField {
59    InterfaceField::new(&property_type.name, to_type_ref(&property_type.data_type)).description(&property_type.description)
60}
61
62pub fn component_id_field(ty: &ComponentTypeId) -> InterfaceField {
63    InterfaceField::new(format!("_{ty}"), TypeRef::named(TypeRef::ID))
64}