Charger des modules dynamiquement en Rust
Compréhension d'une structure de chargement de module avec stable ABI en Rust
Attention: Je vais ici appliquer le chargement dynamique à Castellum, bien que la méthode soit réutilisable.
Introduction
Rust est conçu pour la sécurité, de ce fait, charger des portions de code exécutable dans sa mémoire est assez complexe.
Je vous recommande fortement de consulter ABI Stable pour un exemple de lib Rust chargée dynamiquement, Castellum utilisant la même base.
J’ai d’ailleurs crée un template simple sur leurs exemples: https://gitlab.com/P-atch/rust-dynamic-module-loading-example
Bien que cette base soit fonctionnelle, il manque des parties essentielles pour une app stable:
- Support de paramètres
- Gestion claire des versions
JSON d’informations
Afin de stocker les versions des modules, mais aussi leur types, nous utilisons un JSON de “métadonnées”.
Ce JSON devra être stocké avec la librairie.
Il est généré au moment de la compilation, et réutilise un JSON contenant la définition des paramètres du module.
Via le build.rs, les versions sont extraites depuis les infos de la crate, puis ajoutées à un JSON.
Gestion des paramètres
Un module doit pouvoir recevoir:
- Des paramètres: Conservés le temps du runtime (password utilisateur, etc.)
- Des propriétés: Stockés dans le Castel, permettent de sauvegarder des infos (typiquement des hash de password)
Considérés comme des dictionnaires libres par la lib Castellum, le module peut stocker ce qu’il veut dans les propriétés.
De l’autre côté, l’utilisateur peut donner tous les paramètres qu’il veut au moment de l’ouverture du Castel, ils seront transmis au module.
–> Schéma
Pour simplifier la gestion des paramètres, réutilisons le JSON de métadonnées pour définir les paramètres requis, optionnels et leurs types respectifs.
Les types de paramètres sont les suivants:
| Type | Description |
|---|---|
| Text | Champ texte classique |
| Password | Champ password |
| StaticChoice (Liste de choix) | Liste de choix prédéfinis par la déf du paramètre |
| DynamicChoice | Liste de choix récupérée par une fonction générique définie dans tous les modules |