Rust ne supporte pas le chargement dynamique de crates compilées directement. Alternatives :
use std::ffi::CStr;
use std::os::raw::c_char;
#[repr(C)]
pub struct PluginApi {
pub name: *const c_char,
pub version: *const c_char,
pub init: extern "C" fn(),
pub execute: extern "C" fn(*const c_char) -> *const c_char,
}
// Charger une bibliothèque C
#[cfg(unix)]
pub fn load_plugin(path: &Path) -> Result<PluginApi> {
unsafe {
let lib = libloading::Library::new(path)?;
let api: libloading::Symbol<PluginApi> = lib.get(b"plugin_api")?;
Ok(*api)
}
}use rhai::Engine;
pub struct ScriptPlugin {
engine: Engine,
script: String,
}
impl ScriptPlugin {
pub fn load(path: &Path) -> Result<Self> {
let script = std::fs::read_to_string(path)?;
let mut engine = Engine::new();
// Enregistrer les fonctions disponibles
engine.register_fn("log", |msg: &str| println!("{}", msg));
Ok(Self { engine, script })
}
pub fn execute(&mut self) -> Result<()> {
self.engine.eval::<()>(&self.script)?;
Ok(())
}
}- Pas de chargement dynamique Rust natif : Les crates doivent être compilées statiquement
- ABI instable : L'ABI Rust n'est pas stable entre versions
- Complexité : FFI ajoute de la complexité
- Feature flags : Activer/désactiver des features à la compilation
- Scripts : Utiliser un langage de script (Lua, Rhai, etc.)
- Configuration : Modules activables via configuration
- WebAssembly : Charger des plugins en WASM
- FFI : Interface C pour plugins externes
- Scripts : Langages interprétés pour extensibilité
- Limitations : Pas de chargement dynamique Rust natif
- Alternatives : Feature flags, scripts, WASM