reactive_graph_std_connector/behaviour/relation/complex_connector/
mod.rs

1use reactive_graph_behaviour_model_api::prelude::*;
2use reactive_graph_behaviour_model_impl::relation_behaviour;
3use reactive_graph_graph::prelude::*;
4use reactive_graph_reactive_model_impl::ReactiveRelation;
5use serde_json::Value;
6
7pub use function::COMPLEX_CONNECTOR_BEHAVIOURS;
8pub use function::ComplexConnectorFunction;
9use reactive_graph_std_connector_model::ConnectorProperties::INBOUND_PROPERTY_NAME;
10use reactive_graph_std_connector_model::ConnectorProperties::OUTBOUND_PROPERTY_NAME;
11
12use crate::behaviour::relation::complex_connector::validator::ComplexConnectorValidator;
13
14pub mod function;
15pub mod validator;
16
17relation_behaviour!(
18    ComplexConnector,
19    ComplexConnectorFactory,
20    ComplexConnectorFsm,
21    ComplexConnectorBehaviourTransitions,
22    ComplexConnectorValidator,
23    f,
24    ComplexConnectorFunction
25);
26
27impl ComplexConnectorBehaviourTransitions {
28    fn get_outbound_property_name(&self) -> Option<String> {
29        self.reactive_instance.as_string(OUTBOUND_PROPERTY_NAME.as_ref())
30    }
31
32    fn get_inbound_property_name(&self) -> Option<String> {
33        self.reactive_instance.as_string(INBOUND_PROPERTY_NAME.as_ref())
34    }
35}
36
37impl BehaviourInit<RelationInstanceId, ReactiveRelation> for ComplexConnectorBehaviourTransitions {}
38
39impl BehaviourShutdown<RelationInstanceId, ReactiveRelation> for ComplexConnectorBehaviourTransitions {}
40
41impl BehaviourConnect<RelationInstanceId, ReactiveRelation> for ComplexConnectorBehaviourTransitions {
42    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
43        let outbound_property_name = self.get_outbound_property_name().ok_or(BehaviourConnectFailed {})?;
44        let inbound_property_name = self.get_inbound_property_name().ok_or(BehaviourConnectFailed {})?;
45        let f = self.f;
46        let relation_instance = self.reactive_instance.clone();
47        self.outbound_property_observers
48            .observe_with_handle(&outbound_property_name, move |value: &Value| {
49                // The ComplexConnectorFunction have to propagate
50                f(value.clone(), inbound_property_name.clone(), relation_instance.clone());
51            });
52        Ok(())
53    }
54}
55
56impl BehaviourTransitions<RelationInstanceId, ReactiveRelation> for ComplexConnectorBehaviourTransitions {}