reactive_graph_reactive_service_api/
flow_instance_provider.rs1use 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}