use async_trait::async_trait;
use greentic_deploy_spec::{DeploymentId, Environment, RevisionId};
use super::LocalProcessDeployerHandler;
use crate::env_packs::deployer::{
ArchiveOutcome, Deployer, DeployerError, DrainOutcome, StageOutcome, TrafficSplitOutcome,
WarmOutcome, enforce_split_invariants, require_revision,
};
#[async_trait]
impl Deployer for LocalProcessDeployerHandler {
async fn stage_revision(
&self,
env: &Environment,
revision_id: RevisionId,
) -> Result<StageOutcome, DeployerError> {
require_revision(env, revision_id)?;
Ok(StageOutcome::default())
}
async fn warm_revision(
&self,
env: &Environment,
revision_id: RevisionId,
) -> Result<WarmOutcome, DeployerError> {
require_revision(env, revision_id)?;
Ok(WarmOutcome::default())
}
async fn drain_revision(
&self,
env: &Environment,
revision_id: RevisionId,
) -> Result<DrainOutcome, DeployerError> {
require_revision(env, revision_id)?;
Ok(DrainOutcome::default())
}
async fn archive_revision(
&self,
env: &Environment,
revision_id: RevisionId,
) -> Result<ArchiveOutcome, DeployerError> {
require_revision(env, revision_id)?;
Ok(ArchiveOutcome::default())
}
async fn apply_traffic_split(
&self,
env: &Environment,
deployment_id: DeploymentId,
) -> Result<TrafficSplitOutcome, DeployerError> {
enforce_split_invariants(env, deployment_id)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::env_packs::deployer::run_conformance;
#[tokio::test]
async fn local_process_passes_conformance() {
let handler = LocalProcessDeployerHandler::default();
run_conformance(&handler)
.await
.expect("local-process deployer satisfies the Phase D conformance contract");
}
#[test]
fn handler_exposes_deployer_via_trait_method() {
use crate::env_packs::slot::EnvPackHandler;
let h = LocalProcessDeployerHandler::default();
assert!(
(&h as &dyn EnvPackHandler).as_deployer().is_some(),
"EnvPackHandler::as_deployer must surface the local-process Deployer impl",
);
}
}