use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::model::JsonValue;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum FlowTask {
DriveRun {
run_id: String,
},
ResumeWait {
run_id: String,
wait_id: String,
},
ResumeHook {
run_id: String,
hook_id: String,
payload: JsonValue,
},
ResumeHookByToken {
token: String,
payload: JsonValue,
},
DisposeHook {
run_id: String,
hook_id: String,
},
DisposeHookByToken {
token: String,
},
ResumeDueWaits {
now: DateTime<Utc>,
},
ResumeDueRetries {
now: DateTime<Utc>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct FlowTaskOutcome {
pub task: FlowTask,
pub run_ids: Vec<String>,
pub resumed_waits: Vec<(String, String)>,
pub resumed_retries: Vec<(String, String)>,
pub resumed_hook: Option<(String, String)>,
#[serde(default)]
pub disposed_hook: Option<(String, String)>,
}
impl FlowTaskOutcome {
pub(super) fn new(task: FlowTask) -> Self {
Self {
task,
run_ids: Vec::new(),
resumed_waits: Vec::new(),
resumed_retries: Vec::new(),
resumed_hook: None,
disposed_hook: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct FlowTaskLease {
pub lease_id: String,
pub task: FlowTask,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct LocalFileDeadLetteredTask {
pub lease_id: String,
pub task: FlowTask,
pub reason: String,
pub dead_lettered_at: DateTime<Utc>,
}
#[cfg(feature = "postgres")]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PostgresDeadLetteredTask {
pub lease_id: String,
pub task: FlowTask,
pub reason: String,
pub dead_lettered_at: DateTime<Utc>,
}