use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use super::workflow::CompletionPolicy;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FanOutStep {
pub id: String,
pub destinations: Vec<FanOutDestination>,
pub completion_policy: CompletionPolicy,
pub aggregator: ResultAggregator,
pub partial_success_threshold: Option<f64>,
pub timeout_ms: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FanOutDestination {
pub id: String,
pub name: String,
pub step_config: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ResultAggregator {
Concat,
Merge,
Reduce { expression: String },
First,
Last,
Custom { function: String },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FanOutStatus {
pub fanout_id: String,
pub execution_id: String,
pub branches: Vec<FanOutBranch>,
pub started_at: DateTime<Utc>,
pub completed: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FanOutBranch {
pub destination_id: String,
pub status: FanOutBranchStatus,
pub output: Option<serde_json::Value>,
pub error: Option<String>,
pub duration_ms: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum FanOutBranchStatus {
Pending,
Running,
Success,
Failed,
TimedOut,
Cancelled,
}