use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IdempotencyConfig {
pub step_id: String,
pub key_strategy: KeyStrategy,
pub window: IdempotencyWindow,
pub conflict_resolution: ConflictResolution,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum KeyStrategy {
InputHash,
Expression(String),
FieldPath(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum IdempotencyWindow {
Duration { ms: u64 },
Forever,
UntilNextExecution,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ConflictResolution {
ReturnCached,
RejectNew,
ReplaceOld,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IdempotencyEntry {
pub key: String,
pub step_id: String,
pub execution_id: String,
pub input_hash: String,
pub output: serde_json::Value,
pub created_at: DateTime<Utc>,
pub expires_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IdempotencyReport {
pub total_entries: usize,
pub deduplicated_count: u64,
pub cache_hit_rate: f64,
pub oldest_entry: Option<DateTime<Utc>>,
pub by_step: Vec<StepIdempotencyStats>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StepIdempotencyStats {
pub step_id: String,
pub entries: usize,
pub hits: u64,
pub saved_executions: u64,
}