spn_core/backup/
manifest.rs1use std::collections::HashMap;
7
8#[derive(Debug, Clone)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub struct BackupManifest {
12 pub version: String,
14
15 pub created_at: String,
17
18 pub label: Option<String>,
20
21 pub hostname: String,
23
24 pub versions: ComponentVersions,
26
27 pub checksums: HashMap<String, String>,
29
30 pub contents: BackupContents,
32}
33
34impl BackupManifest {
35 pub fn new(hostname: String, spn_version: String) -> Self {
37 Self {
38 version: "1.0.0".to_string(),
39 created_at: String::new(),
40 label: None,
41 hostname,
42 versions: ComponentVersions {
43 novanet: None,
44 nika: None,
45 spn: spn_version,
46 },
47 checksums: HashMap::new(),
48 contents: BackupContents::default(),
49 }
50 }
51}
52
53#[derive(Debug, Clone, Default)]
55#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
56pub struct ComponentVersions {
57 pub novanet: Option<String>,
59 pub nika: Option<String>,
61 pub spn: String,
63}
64
65#[derive(Debug, Clone, Default)]
67#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
68pub struct BackupContents {
69 pub novanet: NovaNetContents,
71 pub nika: NikaContents,
73 pub spn: SpnContents,
75}
76
77#[derive(Debug, Clone, Default)]
79#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
80pub struct NovaNetContents {
81 pub schema_files: u32,
83 pub seed_files: u32,
85 pub neo4j_dump: bool,
87}
88
89#[derive(Debug, Clone, Default)]
91#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
92pub struct NikaContents {
93 pub workflow_files: u32,
95 pub session_count: u32,
97 pub trace_count: u32,
99}
100
101#[derive(Debug, Clone, Default)]
103#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
104pub struct SpnContents {
105 pub has_config: bool,
107 pub has_mcp_yaml: bool,
109 pub has_jobs: bool,
111}
112
113#[cfg(test)]
114mod tests {
115 use super::*;
116
117 #[test]
118 fn test_manifest_new() {
119 let manifest = BackupManifest::new("test-host".to_string(), "0.15.0".to_string());
120 assert_eq!(manifest.version, "1.0.0");
121 assert_eq!(manifest.hostname, "test-host");
122 assert_eq!(manifest.versions.spn, "0.15.0");
123 assert!(manifest.versions.novanet.is_none());
124 }
125
126 #[test]
127 fn test_backup_contents_default() {
128 let contents = BackupContents::default();
129 assert_eq!(contents.novanet.schema_files, 0);
130 assert!(!contents.spn.has_config);
131 }
132}