use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
pub const PROJECT_RUNTIME_SNAPSHOT_SCHEMA_VERSION: u32 = 1;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum RuntimeSnapshotScope {
LocalDb,
RuntimeDir,
FilesPublic,
FilesPrivate,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum RuntimeSnapshotFormat {
SqliteFile,
TarArchive,
DirectoryManifest,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
pub struct RuntimeSnapshotPart {
pub scope: RuntimeSnapshotScope,
pub format: RuntimeSnapshotFormat,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub path: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sha256: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub size_bytes: Option<u64>,
}
impl Default for RuntimeSnapshotScope {
fn default() -> Self {
Self::LocalDb
}
}
impl Default for RuntimeSnapshotFormat {
fn default() -> Self {
Self::DirectoryManifest
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ProjectRuntimeSnapshot {
#[serde(default = "default_project_runtime_snapshot_schema_version")]
pub schema_version: u32,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub snapshot_id: String,
pub owner: String,
pub project: String,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub revision: String,
#[serde(default)]
pub captured_at: i64,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub parts: Vec<RuntimeSnapshotPart>,
#[serde(default, skip_serializing_if = "Value::is_null")]
pub metadata: Value,
}
const fn default_project_runtime_snapshot_schema_version() -> u32 {
PROJECT_RUNTIME_SNAPSHOT_SCHEMA_VERSION
}
impl Default for ProjectRuntimeSnapshot {
fn default() -> Self {
Self {
schema_version: PROJECT_RUNTIME_SNAPSHOT_SCHEMA_VERSION,
snapshot_id: String::new(),
owner: String::new(),
project: String::new(),
revision: String::new(),
captured_at: 0,
parts: Vec::new(),
metadata: Value::Object(Map::new()),
}
}
}