use serde::{Deserialize, Serialize};
use std::time::Duration;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionPlan {
pub id: String,
pub name: String,
pub steps: Vec<ExecutionStep>,
pub risk_score: RiskScore,
pub estimated_duration: Duration,
pub estimated_complexity: ComplexityLevel,
pub requires_approval: bool,
pub editable: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionStep {
pub id: String,
pub description: String,
pub action: StepAction,
pub risk_score: RiskScore,
pub dependencies: Vec<String>,
pub rollback_action: Option<RollbackAction>,
pub status: StepStatus,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum StepStatus {
Pending,
Running,
Completed,
Skipped,
Failed,
RolledBack,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum StepAction {
CreateFile {
path: String,
content: String,
},
ModifyFile {
path: String,
diff: String,
},
DeleteFile {
path: String,
},
RunCommand {
command: String,
args: Vec<String>,
},
RunTests {
pattern: Option<String>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RiskScore {
pub level: RiskLevel,
pub score: f32,
pub factors: Vec<RiskFactor>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum RiskLevel {
Low,
Medium,
High,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RiskFactor {
pub name: String,
pub weight: f32,
pub description: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum ComplexityLevel {
#[default]
Simple,
Moderate,
Complex,
VeryComplex,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionResult {
pub plan_id: String,
pub status: ExecutionStatus,
pub step_results: Vec<StepResult>,
pub test_results: Option<TestResults>,
pub duration: Duration,
pub rollback_performed: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ExecutionStatus {
Pending,
Running,
WaitingApproval,
Completed,
Failed,
RolledBack,
Paused,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StepResult {
pub step_id: String,
pub success: bool,
pub error: Option<String>,
pub duration: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TestResults {
pub passed: usize,
pub failed: usize,
pub skipped: usize,
pub failures: Vec<TestFailure>,
pub framework: TestFramework,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TestFailure {
pub name: String,
pub message: String,
pub location: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TestFramework {
Rust,
TypeScript,
Python,
Other,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RollbackAction {
pub action_type: RollbackType,
pub data: serde_json::Value,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum RollbackType {
RestoreFile,
DeleteFile,
RunCommand,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum ExecutionMode {
#[default]
Automatic,
StepByStep,
DryRun,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionState {
pub execution_id: String,
pub current_step_index: usize,
pub completed_steps: Vec<StepResult>,
pub mode: ExecutionMode,
pub paused_at: chrono::DateTime<chrono::Utc>,
}
impl ExecutionPlan {
pub fn new(name: String, steps: Vec<ExecutionStep>) -> Self {
Self {
id: Uuid::new_v4().to_string(),
name,
steps,
risk_score: RiskScore {
level: RiskLevel::Low,
score: 0.0,
factors: Vec::new(),
},
estimated_duration: Duration::from_secs(0),
estimated_complexity: ComplexityLevel::Simple,
requires_approval: false,
editable: true,
}
}
}
impl ExecutionStep {
pub fn new(description: String, action: StepAction) -> Self {
Self {
id: Uuid::new_v4().to_string(),
description,
action,
risk_score: RiskScore {
level: RiskLevel::Low,
score: 0.0,
factors: Vec::new(),
},
dependencies: Vec::new(),
rollback_action: None,
status: StepStatus::Pending,
}
}
}
impl Default for RiskScore {
fn default() -> Self {
Self {
level: RiskLevel::Low,
score: 0.0,
factors: Vec::new(),
}
}
}