reactive_graph_std_connector/behaviour/relation/connector/
mod.rs1use 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 {}