Aller au contenu

Logique lifecycle

AQE expose un trait par phase :

aq-engine/src/core/lifecycle/mod.rs
pub trait OnStartLogic {
fn version(&self) -> &str;
fn run(&mut self, ctx: &mut dyn StrategyContext) -> LifecycleResult;
}
pub trait OnInitLogic {
fn version(&self) -> &str;
fn run(&mut self, ctx: &mut dyn StrategyContext, asset: &Asset) -> LifecycleResult;
}
pub trait OnTeardownLogic {
fn version(&self) -> &str;
fn run(&mut self, ctx: &mut dyn StrategyContext) -> LifecycleResult;
}

Chaque méthode run retourne LifecycleResult, qui enregistre le succès, un message optionnel et les métadonnées du composant. Un composant en échec avec can_fail(false) arrête le run; avec can_fail(true), AQE journalise l’échec et continue.

Politique par défaut :

  • OnStartLogic : strict par défaut
  • OnInitLogic : strict par défaut
  • OnTeardownLogic : tolérant par défaut, pour laisser le nettoyage continuer si possible

Les wrappers lifecycle utilisent LifecycleTiming pour choisir où ils s’exécutent autour du corps de la méthode :

LifecycleTiming::BeforeGenerated
LifecycleTiming::AfterGenerated

Dans les projets AQS générés, “generated” désigne le corps de méthode généré depuis le graphe. Dans les projets AQE écrits à la main, c’est le corps inline de votre implémentation Strategy.

Utilisez BeforeGenerated pour la validation, la configuration d’environnement, l’initialisation d’état et les dépendances attendues par le corps de stratégie. Utilisez AfterGenerated pour le suivi, les contrôles d’enregistrement et les métadonnées qui dépendent du corps de stratégie.

Les projets AQE directs enregistrent la logique lifecycle sur StrategyState avant de démarrer le run. Le moteur appelle les composants automatiquement; le code utilisateur ne doit pas appeler manuellement les helpers d’exécution lifecycle.

state.add_on_start_logic(
OnStartLogicBuilder::new(Box::new(SeedRuntimeState::new()))
.timing(LifecycleTiming::BeforeGenerated)
.can_fail(false)
.build(),
);
state.add_on_init_logic(
OnInitLogicBuilder::new(Box::new(InitAssetState::new()))
.timing(LifecycleTiming::AfterGenerated)
.can_fail(false)
.build(),
);
state.add_on_teardown_logic(
OnTeardownLogicBuilder::new(Box::new(FlushRuntimeLogs::new()))
.timing(LifecycleTiming::AfterGenerated)
.can_fail(true)
.build(),
);