reactive_graph_std_connector/behaviour/component/propagation_counter/
mod.rs1use reactive_graph_behaviour_model_api::behaviour_validator;
2use reactive_graph_behaviour_model_api::prelude::*;
3use reactive_graph_behaviour_model_impl::relation_behaviour;
4use reactive_graph_graph::prelude::*;
5use reactive_graph_reactive_model_impl::ReactiveRelation;
6use serde_json::json;
7
8use reactive_graph_std_connector_model::ConnectorProperties::OUTBOUND_PROPERTY_NAME;
9use reactive_graph_std_connector_model::PropagationCounterProperties::PROPAGATION_COUNT;
10
11relation_behaviour!(
12 PropagationCounter,
13 PropagationCounterFactory,
14 PropagationCounterFsm,
15 PropagationCounterBehaviourTransitions,
16 PropagationCounterValidator
17);
18
19behaviour_validator!(
20 PropagationCounterValidator,
21 RelationInstanceId,
22 ReactiveRelation,
23 OUTBOUND_PROPERTY_NAME.as_ref(),
24 PROPAGATION_COUNT.as_ref()
25);
26
27impl PropagationCounterBehaviourTransitions {
28 fn get_outbound_property_name(&self) -> Option<String> {
29 self.reactive_instance.as_string(OUTBOUND_PROPERTY_NAME.as_ref())
30 }
31}
32
33impl BehaviourInit<RelationInstanceId, ReactiveRelation> for PropagationCounterBehaviourTransitions {}
34
35impl BehaviourShutdown<RelationInstanceId, ReactiveRelation> for PropagationCounterBehaviourTransitions {}
36
37impl BehaviourConnect<RelationInstanceId, ReactiveRelation> for PropagationCounterBehaviourTransitions {
38 fn connect(&self) -> Result<(), BehaviourConnectFailed> {
39 let outbound_property_name = self.get_outbound_property_name().ok_or(BehaviourConnectFailed {})?;
40 let reactive_instance = self.reactive_instance.clone();
41 self.outbound_property_observers.observe_with_handle(outbound_property_name.as_str(), move |_| {
42 if let Some(mut count) = reactive_instance.as_u64(PROPAGATION_COUNT) {
43 count += 1;
44 reactive_instance.set(PROPAGATION_COUNT.as_ref(), json!(count));
45 }
46 });
47 Ok(())
48 }
49}
50
51impl BehaviourTransitions<RelationInstanceId, ReactiveRelation> for PropagationCounterBehaviourTransitions {}