use async_trait::async_trait;
use crate::adapters::MigrationRunner;
use crate::errors::Result;
use crate::planner::MigrationPlan;
#[derive(Debug, Clone)]
pub struct ExecutionResult {
pub steps_executed: usize,
pub total_steps: usize,
pub success: bool,
pub error: Option<String>,
pub duration_secs: f64,
}
#[async_trait]
pub trait Executor: Send + Sync {
async fn execute(
&self,
tenant: &crate::cli::TenantContext,
plan: &MigrationPlan,
runner: &dyn MigrationRunner,
) -> Result<ExecutionResult>;
async fn dry_run(
&self,
tenant: &crate::cli::TenantContext,
plan: &MigrationPlan,
runner: &dyn MigrationRunner,
) -> Result<ExecutionResult>;
}