reactive_graph_plugin_api/
plugin_declaration.rs1use std::sync::Arc;
2
3use crate::Plugin;
4use crate::PluginContext;
5use crate::PluginDependency;
6use crate::PluginLoadingError;
7
8#[derive(Copy, Clone)]
9pub struct PluginDeclaration {
10 pub rustc_version: &'static str,
12
13 pub plugin_api_version: &'static str,
15
16 pub name: &'static str,
18
19 pub description: &'static str,
21
22 pub version: &'static str,
24
25 #[allow(improper_ctypes_definitions)]
27 pub register: unsafe extern "C" fn(&mut dyn PluginRegistrar) -> Result<(), PluginLoadingError>,
28
29 #[allow(improper_ctypes_definitions)]
31 pub get_dependencies: unsafe extern "C" fn() -> Vec<PluginDependency>,
32}
33
34pub trait PluginRegistrar {
36 fn register_plugin(&mut self, plugin: Box<Arc<dyn Plugin>>);
38
39 fn context(&self) -> Arc<dyn PluginContext + Send + Sync>;
41}
42
43#[macro_export]
44macro_rules! export_plugin_declaration {
45 () => {
46 #[doc(hidden)]
47 #[unsafe(no_mangle)]
48 pub static plugin_declaration: $crate::PluginDeclaration = $crate::PluginDeclaration {
49 rustc_version: $crate::RUSTC_VERSION,
50 plugin_api_version: $crate::PLUGIN_API_VERSION,
51 name: PLUGIN_NAME,
52 description: PLUGIN_DESCRIPTION,
53 version: PLUGIN_VERSION,
54 register,
55 get_dependencies,
56 };
57 };
58}