reactive_graph_std_numeric/implementation/
numeric_constants_factory.rs

1use std::ops::Deref;
2use std::sync::Arc;
3
4use async_trait::async_trait;
5use log::debug;
6use log::error;
7use reactive_graph_graph::prelude::*;
8use reactive_graph_plugin_api::Component;
9use reactive_graph_plugin_api::EntityInstanceManager;
10use reactive_graph_plugin_api::EntityTypeManager;
11use reactive_graph_plugin_api::component_alias;
12use reactive_graph_reactive_model_impl::ReactiveEntity;
13use reactive_graph_reactive_model_impl::ReactiveProperties;
14use serde_json::json;
15use uuid::Uuid;
16
17use reactive_graph_std_value_model::ENTITY_TYPE_VALUE_NUMBER;
18
19use crate::api::numeric_constants_factory::NumericConstantsFactory;
20use crate::constants::NUMERIC_CONSTANTS;
21use crate::constants::UUID_NAMESPACE_NUMERIC_CONSTANTS;
22
23#[derive(Component)]
24pub struct NumericConstantsFactoryImpl {
25    #[component(default = "crate::plugin::entity_type_manager")]
26    entity_type_manager: Arc<dyn EntityTypeManager + Send + Sync>,
27    #[component(default = "crate::plugin::entity_instance_manager")]
28    entity_instance_manager: Arc<dyn EntityInstanceManager + Send + Sync>,
29}
30
31#[async_trait]
32#[component_alias]
33impl NumericConstantsFactory for NumericConstantsFactoryImpl {
34    async fn create_numeric_constants(&self) {
35        let ty = ENTITY_TYPE_VALUE_NUMBER.deref();
36        let Some(entity_type) = self.entity_type_manager.get(ty) else {
37            return;
38        };
39        for (name, value) in NUMERIC_CONSTANTS.iter() {
40            let id = get_id_for_numeric_constant(name);
41            if self.entity_instance_manager.has(id) {
42                continue;
43            }
44            let mut properties = PropertyInstances::new_from_property_types_with_defaults(&entity_type.properties);
45            properties.set(*name, json!(value));
46            let properties = ReactiveProperties::new_with_id_from_properties(id, properties);
47            let reactive_entity = ReactiveEntity::builder()
48                .ty(ty)
49                .id(id)
50                .components(entity_type.components.clone())
51                .properties(properties)
52                .build();
53            let reactive_entity = self.entity_instance_manager.register(reactive_entity);
54            match reactive_entity {
55                Ok(reactive_entity) => {
56                    debug!("Created numeric constant {} {} as entity instance {}", name, value, reactive_entity.id);
57                }
58                Err(_) => {
59                    error!("Failed to create entity instance for constant {} {}!", name, value);
60                }
61            }
62        }
63    }
64}
65
66fn get_id_for_numeric_constant(name: &str) -> Uuid {
67    Uuid::new_v5(&UUID_NAMESPACE_NUMERIC_CONSTANTS, name.as_bytes())
68}