reactive_graph_dynamic_graph_impl/field/
component.rs1use 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}