reactive_graph_std_connector/behaviour/relation/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::CONNECTOR_BEHAVIOURS;
8pub use function::ConnectorFunction;
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::connector::validator::ConnectorValidator;
13
14pub mod function;
15pub mod validator;
16
17relation_behaviour!(
18    Connector,
19    ConnectorFactory,
20    ConnectorFsm,
21    ConnectorBehaviourTransitions,
22    ConnectorValidator,
23    f,
24    ConnectorFunction
25);
26
27impl ConnectorBehaviourTransitions {
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 ConnectorBehaviourTransitions {
38    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
39        let outbound_property_name = self.get_outbound_property_name().ok_or(BehaviourInitializationFailed {})?;
40        let inbound_property_name = self.get_inbound_property_name().ok_or(BehaviourInitializationFailed {})?;
41        let value = self
42            .reactive_instance
43            .outbound
44            .get(outbound_property_name)
45            .ok_or(BehaviourInitializationFailed {})?;
46        let f = self.f;
47        self.reactive_instance.inbound.set(inbound_property_name.clone(), f(&value));
48        Ok(())
49    }
50}
51
52impl BehaviourShutdown<RelationInstanceId, ReactiveRelation> for ConnectorBehaviourTransitions {}
53
54impl BehaviourConnect<RelationInstanceId, ReactiveRelation> for ConnectorBehaviourTransitions {
55    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
56        let outbound_property_name = self.get_outbound_property_name().ok_or(BehaviourConnectFailed {})?;
57        let inbound_property_name = self.get_inbound_property_name().ok_or(BehaviourConnectFailed {})?;
58        let f = self.f;
59        let inbound = self.reactive_instance.inbound.clone();
60        self.outbound_property_observers
61            .observe_with_handle(&outbound_property_name, move |value: &Value| {
62                inbound.set(inbound_property_name.clone(), f(value));
63            });
64        Ok(())
65    }
66}
67
68impl BehaviourTransitions<RelationInstanceId, ReactiveRelation> for ConnectorBehaviourTransitions {}