use chrono::{DateTime, Utc};
use serde::Serialize;
use std::fmt;
use systemprompt_identifiers::SourceId;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize)]
pub enum LocalSyncDirection {
#[default]
ToDisk,
ToDatabase,
}
impl fmt::Display for LocalSyncDirection {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::ToDisk => write!(f, "to_disk"),
Self::ToDatabase => write!(f, "to_database"),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize)]
pub enum DiffStatus {
Added,
Removed,
Modified,
}
#[derive(Clone, Debug, Serialize)]
pub struct ContentDiffItem {
pub slug: String,
pub source_id: SourceId,
pub status: DiffStatus,
pub disk_hash: Option<String>,
pub db_hash: Option<String>,
pub disk_updated_at: Option<DateTime<Utc>>,
pub db_updated_at: Option<DateTime<Utc>>,
pub title: Option<String>,
}
#[derive(Clone, Debug, Serialize)]
pub struct ContentDiffResult {
pub source_id: SourceId,
pub added: Vec<ContentDiffItem>,
pub removed: Vec<ContentDiffItem>,
pub modified: Vec<ContentDiffItem>,
pub unchanged: usize,
}
impl Default for ContentDiffResult {
fn default() -> Self {
Self {
source_id: SourceId::new(""),
added: Vec::new(),
removed: Vec::new(),
modified: Vec::new(),
unchanged: 0,
}
}
}
impl ContentDiffResult {
pub fn has_changes(&self) -> bool {
!self.added.is_empty() || !self.removed.is_empty() || !self.modified.is_empty()
}
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct LocalSyncResult {
pub items_synced: usize,
pub items_skipped: usize,
pub items_skipped_modified: usize,
pub items_deleted: usize,
pub errors: Vec<String>,
pub direction: LocalSyncDirection,
}
#[derive(Debug)]
pub struct DiskContent {
pub slug: String,
pub title: String,
pub body: String,
}