reactive_graph_behaviour_model_impl/behaviour/relation/
transition.rs

1#[macro_export]
2macro_rules! relation_behaviour_transitions {
3    ($transitions: ident $(, $fn_name:ident, $fn_ident: ident)*) => {
4        pub struct $transitions {
5            pub reactive_instance: reactive_graph_reactive_model_impl::ReactiveRelation,
6            pub outbound_property_observers: $crate::EntityPropertyObserverContainerImpl,
7            pub property_observers: $crate::RelationPropertyObserverContainerImpl,
8            pub inbound_property_observers: $crate::EntityPropertyObserverContainerImpl,
9            pub ty: reactive_graph_behaviour_model_api::BehaviourTypeId,
10            $(pub $fn_name: $fn_ident,)*
11        }
12
13        impl $transitions {
14            pub fn new(reactive_instance: reactive_graph_reactive_model_impl::ReactiveRelation, ty: reactive_graph_behaviour_model_api::BehaviourTypeId $(, $fn_name: $fn_ident)*) -> Self {
15                let outbound_property_observers = $crate::EntityPropertyObserverContainerImpl::new(reactive_instance.outbound.clone());
16                let property_observers = $crate::RelationPropertyObserverContainerImpl::new(reactive_instance.clone());
17                let inbound_property_observers = $crate::EntityPropertyObserverContainerImpl::new(reactive_instance.inbound.clone());
18                $transitions {
19                    reactive_instance,
20                    outbound_property_observers,
21                    property_observers,
22                    inbound_property_observers,
23                    ty,
24                    $($fn_name,)*
25                }
26            }
27        }
28
29        impl $crate::BehaviourDisconnect<reactive_graph_graph::RelationInstanceId, reactive_graph_reactive_model_impl::ReactiveRelation> for $transitions {
30            fn disconnect(&self) -> Result<(), $crate::BehaviourDisconnectFailed> {
31                self.inbound_property_observers.remove_all_observers();
32                self.property_observers.remove_all_observers();
33                self.outbound_property_observers.remove_all_observers();
34                Ok(())
35            }
36        }
37
38        impl reactive_graph_reactive_model_api::ReactiveInstanceContainer<reactive_graph_graph::RelationInstanceId, reactive_graph_reactive_model_impl::ReactiveRelation> for $transitions {
39            fn get_reactive_instance(&self) -> &reactive_graph_reactive_model_impl::ReactiveRelation {
40                &self.reactive_instance
41            }
42        }
43
44        impl Drop for $transitions {
45            fn drop(&mut self) {
46                let _ = self.disconnect();
47                self.reactive_instance.remove_behaviour(&self.ty);
48                let _ = self.shutdown();
49            }
50        }
51    };
52}