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_deleted: usize,
73    pub errors: Vec<String>,
74    pub direction: String,
75}
76
77#[derive(Debug)]
78pub struct DiskContent {
79    pub slug: String,
80    pub title: String,
81    pub body: String,
82}
83
84#[derive(Debug)]
85pub struct DiskSkill {
86    pub skill_id: String,
87    pub name: String,
88    pub description: String,
89    pub instructions: String,
90    pub file_path: String,
91}
92
93#[derive(Clone, Debug, Serialize)]
94pub struct PlaybookDiffItem {
95    pub playbook_id: String,
96    pub file_path: String,
97    pub category: String,
98    pub domain: String,
99    pub status: DiffStatus,
100    pub disk_hash: Option<String>,
101    pub db_hash: Option<String>,
102    pub name: Option<String>,
103}
104
105#[derive(Clone, Debug, Default, Serialize)]
106pub struct PlaybooksDiffResult {
107    pub added: Vec<PlaybookDiffItem>,
108    pub removed: Vec<PlaybookDiffItem>,
109    pub modified: Vec<PlaybookDiffItem>,
110    pub unchanged: usize,
111}
112
113impl PlaybooksDiffResult {
114    pub fn has_changes(&self) -> bool {
115        !self.added.is_empty() || !self.removed.is_empty() || !self.modified.is_empty()
116    }
117}
118
119#[derive(Debug)]
120pub struct DiskPlaybook {
121    pub playbook_id: String,
122    pub name: String,
123    pub description: String,
124    pub instructions: String,
125    pub category: String,
126    pub domain: String,
127    pub file_path: String,
128}