(
&self,
sandbox: &Sandbox,
state_dir: &Path,
plan: &mut LaunchPlan,
)
| 551 | } |
| 552 | |
| 553 | pub async fn configure_launch( |
| 554 | &self, |
| 555 | sandbox: &Sandbox, |
| 556 | state_dir: &Path, |
| 557 | plan: &mut LaunchPlan, |
| 558 | ) -> LifecycleResult<()> { |
| 559 | for ext in self.active_for(sandbox) { |
| 560 | let descriptor = ext.descriptor(); |
| 561 | for backend in descriptor.required_backends { |
| 562 | plan.require_backend(backend); |
| 563 | } |
| 564 | plan.require_backend_features(descriptor.required_backend_features); |
| 565 | // Snapshot fields where "last writer wins" could mask an |
| 566 | // extension conflict, so we can flag the conflict instead of |
| 567 | // silently dropping the earlier value. |
| 568 | let prev_kernel_profile = plan.kernel_profile.clone(); |
| 569 | let prev_kernel_image = plan.kernel_image.clone(); |
| 570 | ext.configure_launch(sandbox, state_dir, plan).await?; |
| 571 | warn_on_singleton_overwrite( |
| 572 | ext.name(), |
| 573 | "kernel_profile", |
| 574 | prev_kernel_profile.as_deref(), |
| 575 | plan.kernel_profile.as_deref(), |
| 576 | ); |
| 577 | warn_on_singleton_overwrite( |
| 578 | ext.name(), |
| 579 | "kernel_image", |
| 580 | prev_kernel_image |
| 581 | .as_deref() |
| 582 | .map(|p| p.display().to_string()), |
| 583 | plan.kernel_image |
| 584 | .as_deref() |
| 585 | .map(|p| p.display().to_string()), |
| 586 | ); |
| 587 | } |
| 588 | Ok(()) |
| 589 | } |
| 590 | |
| 591 | pub async fn before_launch( |
| 592 | &self, |
no test coverage detected