Dynamic loading — use libloading or trait objects.
Trait objects:
1trait Plugin {2 fn name(&self) -> &str;3 fn execute(&self, input: &str) -> String;4}56struct PluginRegistry {7 plugins: Vec<Box<dyn Plugin>>,8}910impl PluginRegistry {11 fn register(&mut self, plugin: Box<dyn Plugin>) {12 self.plugins.push(plugin);13 }1415 fn execute_all(&self, input: &str) {16 for plugin in &self.plugins {17 println!("{}: {}", plugin.name(), plugin.execute(input));18 }19 }20}
Dynamic loading:
1use libloading::Library;23unsafe {4 let lib = Library::new("plugin.so").unwrap();5 let func: Symbol<fn() -> Box<dyn Plugin>> =6 lib.get(b"create_plugin").unwrap();7 let plugin = func();8}
Key: Trait objects for static, libloading for dynamic.