use serde::{Deserialize, Serialize};
use crate::model::{Input, Lineage, Output, RulePhase};
use crate::plan::{PlanGuarantees, PlanIdentity, PlanNode};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExecutionTarget {
pub engine_id: String,
pub engine_version: String,
pub capability_version: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExecutionPlan {
pub target: ExecutionTarget,
pub identity: PlanIdentity,
pub inputs: Vec<Input>,
pub outputs: Vec<Output>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub nodes: Vec<PlanNode>,
pub steps: Vec<ExecutionStep>,
pub guarantees: PlanGuarantees,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub lineage: Option<Lineage>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExecutionStep {
pub id: String,
pub kind: ExecutionStepKind,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "camelCase")]
pub enum ExecutionStepKind {
ValidateRules {
phase: RulePhase,
rule_ids: Vec<String>,
},
ApplyAction {
node_id: String,
action_id: String,
target: String,
},
EvaluateExpression {
node_id: String,
expression_id: String,
},
MaterializeOutput {
output_id: String,
input_ids: Vec<String>,
},
}