use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json::Value as JsonValue;
use crate::config::RunnableConfig;
pub type ChannelVersion = JsonValue;
pub type ChannelVersions = HashMap<String, ChannelVersion>;
pub type PendingWrite = (String, String, JsonValue);
pub const LATEST_VERSION: i64 = 2;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum CheckpointSource {
Input,
Loop,
Update,
Fork,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CheckpointMetadata {
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<CheckpointSource>,
#[serde(skip_serializing_if = "Option::is_none")]
pub step: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parents: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub run_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Checkpoint {
pub v: i64,
pub id: String,
pub ts: String,
pub channel_values: HashMap<String, JsonValue>,
pub channel_versions: ChannelVersions,
pub versions_seen: HashMap<String, ChannelVersions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_channels: Option<Vec<String>>,
}
#[derive(Debug, Clone)]
pub struct CheckpointTuple {
pub config: RunnableConfig,
pub checkpoint: Checkpoint,
pub metadata: CheckpointMetadata,
pub parent_config: Option<RunnableConfig>,
pub pending_writes: Option<Vec<PendingWrite>>,
}
impl Checkpoint {
pub fn empty() -> Self {
use chrono::Utc;
use crate::checkpoint::id::uuid6;
Self {
v: LATEST_VERSION,
id: uuid6(),
ts: Utc::now().to_rfc3339(),
channel_values: HashMap::new(),
channel_versions: HashMap::new(),
versions_seen: HashMap::new(),
updated_channels: None,
}
}
pub fn copy(&self) -> Self {
Self {
v: self.v,
id: self.id.clone(),
ts: self.ts.clone(),
channel_values: self.channel_values.clone(),
channel_versions: self.channel_versions.clone(),
versions_seen: self.versions_seen.clone(),
updated_channels: self.updated_channels.clone(),
}
}
}