Skip to main content

systemprompt_sync/models/
local_sync.rs

1use chrono::{DateTime, Utc};
2use serde::Serialize;
3
4#[derive(Clone, Copy, Debug, PartialEq, Eq)]
5pub enum LocalSyncDirection {
6    ToDisk,
7    ToDatabase,
8}
9
10#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize)]
11pub enum DiffStatus {
12    Added,
13    Removed,
14    Modified,
15}
16
17#[derive(Clone, Debug, Serialize)]
18pub struct ContentDiffItem {
19    pub slug: String,
20    pub source_id: String,
21    pub status: DiffStatus,
22    pub disk_hash: Option<String>,
23    pub db_hash: Option<String>,
24    pub disk_updated_at: Option<DateTime<Utc>>,
25    pub db_updated_at: Option<DateTime<Utc>>,
26    pub title: Option<String>,
27}
28
29#[derive(Clone, Debug, Serialize)]
30pub struct SkillDiffItem {
31    pub skill_id: String,
32    pub file_path: String,
33    pub status: DiffStatus,
34    pub disk_hash: Option<String>,
35    pub db_hash: Option<String>,
36    pub name: Option<String>,
37}
38
39#[derive(Clone, Debug, Default, Serialize)]
40pub struct ContentDiffResult {
41    pub source_id: String,
42    pub added: Vec<ContentDiffItem>,
43    pub removed: Vec<ContentDiffItem>,
44    pub modified: Vec<ContentDiffItem>,
45    pub unchanged: usize,
46}
47
48impl ContentDiffResult {
49    pub fn has_changes(&self) -> bool {
50        !self.added.is_empty() || !self.removed.is_empty() || !self.modified.is_empty()
51    }
52}
53
54#[derive(Clone, Debug, Default, Serialize)]
55pub struct SkillsDiffResult {
56    pub added: Vec<SkillDiffItem>,
57    pub removed: Vec<SkillDiffItem>,
58    pub modified: Vec<SkillDiffItem>,
59    pub unchanged: usize,
60}
61
62impl SkillsDiffResult {
63    pub fn has_changes(&self) -> bool {
64        !self.added.is_empty() || !self.removed.is_empty() || !self.modified.is_empty()
65    }
66}
67
68#[derive(Clone, Debug, Default, Serialize)]
69pub struct LocalSyncResult {
70    pub items_synced: usize,
71    pub items_skipped: usize,
72    pub items_skipped_modified: usize,
73    pub items_deleted: usize,
74    pub errors: Vec<String>,
75    pub direction: String,
76}
77
78#[derive(Debug)]
79pub struct DiskContent {
80    pub slug: String,
81    pub title: String,
82    pub body: String,
83}
84
85#[derive(Debug)]
86pub struct DiskSkill {
87    pub skill_id: String,
88    pub name: String,
89    pub description: String,
90    pub instructions: String,
91    pub file_path: String,
92}
93
94#[derive(Clone, Debug, Serialize)]
95pub struct PlaybookDiffItem {
96    pub playbook_id: String,
97    pub file_path: String,
98    pub category: String,
99    pub domain: String,
100    pub status: DiffStatus,
101    pub disk_hash: Option<String>,
102    pub db_hash: Option<String>,
103    pub name: Option<String>,
104}
105
106#[derive(Clone, Debug, Default, Serialize)]
107pub struct PlaybooksDiffResult {
108    pub added: Vec<PlaybookDiffItem>,
109    pub removed: Vec<PlaybookDiffItem>,
110    pub modified: Vec<PlaybookDiffItem>,
111    pub unchanged: usize,
112}
113
114impl PlaybooksDiffResult {
115    pub fn has_changes(&self) -> bool {
116        !self.added.is_empty() || !self.removed.is_empty() || !self.modified.is_empty()
117    }
118}
119
120#[derive(Debug)]
121pub struct DiskPlaybook {
122    pub playbook_id: String,
123    pub name: String,
124    pub description: String,
125    pub instructions: String,
126    pub category: String,
127    pub domain: String,
128    pub file_path: String,
129}