systemprompt-sync 0.9.0

Cloud sync services for systemprompt.io AI governance infrastructure. File, database, and crate deployment across governance tenants in the MCP governance pipeline.
Documentation
//! Plain-data structs returned by the local-sync diff calculators and the
//! disk-side parsers. All fields are public so callers can render them
//! directly into CLI tables or JSON responses.

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,
}