use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchOperation {
pub id: String,
pub tool: String,
pub arguments: Value,
#[serde(default)]
pub depends_on: Vec<String>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
#[derive(Default)]
pub enum BatchMode {
#[default]
Parallel,
Sequential,
FailFast,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchRequest {
pub operations: Vec<BatchOperation>,
#[serde(default)]
pub mode: BatchMode,
#[serde(default = "default_max_parallel")]
pub max_parallel: usize,
}
fn default_max_parallel() -> usize {
10
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OperationResult {
pub id: String,
pub success: bool,
pub result: Option<Value>,
pub error: Option<OperationError>,
pub duration_ms: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OperationError {
pub code: i32,
pub message: String,
pub details: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchResponse {
pub results: Vec<OperationResult>,
pub total_duration_ms: u64,
pub success_count: usize,
pub failure_count: usize,
pub stats: BatchStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchStats {
pub total_operations: usize,
pub parallel_executed: usize,
pub sequential_executed: usize,
pub avg_duration_ms: f64,
}