reactive_graph_reactive_service_api/
flow_instance_provider.rs

1use reactive_graph_graph::FlowInstance;
2
3#[derive(Debug)]
4pub enum FlowInstanceProviderError {
5    InitializationError,
6}
7
8pub trait FlowInstanceProvider: Send + Sync {
9    fn get_flow_instances(&self) -> Vec<FlowInstance>;
10}
11
12#[macro_export]
13macro_rules! flow_instance_provider {
14    ($flow_instance_provider:expr) => {{
15        let flow_instance_provider = $flow_instance_provider.clone();
16        let flow_instance_provider: Result<Arc<dyn FlowInstanceProvider>, _> = <dyn query_interface::Object>::query_arc(flow_instance_provider);
17        if flow_instance_provider.is_err() {
18            return Err(FlowInstanceProviderError::InitializationError);
19        }
20        Ok(flow_instance_provider.ok())
21    }};
22}
23
24#[macro_export]
25macro_rules! flow_instance_provider_impl {
26    ($asset: ident, $path: expr) => {
27        paste::paste! {
28            use reactive_graph_graph::FlowInstance as ModelFlowInstance;
29
30            #[derive(reactive_graph_plugin_api::RustEmbed)]
31            #[folder = $path]
32            struct [<$asset FlowInstanceAsset>];
33
34            pub trait [<$asset FlowInstanceProvider>]: $crate::FlowInstanceProvider + Send + Sync {}
35
36            #[derive(Clone)]
37            pub struct [<$asset FlowInstanceProviderImpl>] {}
38
39            interfaces!([<$asset FlowInstanceProviderImpl>]: dyn $crate::FlowInstanceProvider);
40
41            #[reactive_graph_core_di::component]
42            impl [<$asset FlowInstanceProviderImpl>] {
43                #[provides]
44                fn new() -> Self {
45                    Self {}
46                }
47            }
48
49            #[reactive_graph_core_di::provides]
50            impl [<$asset FlowInstanceProvider>] for [<$asset FlowInstanceProviderImpl>] {}
51
52            impl $crate::FlowInstanceProvider for [<$asset FlowInstanceProviderImpl>] {
53                fn get_flow_instances(&self) -> Vec<ModelFlowInstance> {
54                    $crate::embedded_asset_provider_impl!([<$asset FlowInstanceAsset>], ModelFlowInstance)
55                }
56            }
57        }
58    };
59}