1use serde::{Deserialize, Serialize};
2use semver::Version;
3
4#[derive(Debug, Serialize, Deserialize)]
5pub struct UpdateData {
6 pub version: Version,
7 pub url: String,
8}
9impl UpdateData {
10 pub fn new(version: Version, url: String) -> Self {
11 UpdateData { version, url }
12 }
13 pub fn url(&self) -> &str {
14 &self.url
15 }
16}
17
18#[derive(Debug, Serialize, Deserialize)]
19pub struct UpdateManifest {
20 pub x64: Option<UpdateData>,
21 pub x86: Option<UpdateData>,
22 pub macos: Option<UpdateData>,
23 pub linux: Option<UpdateData>,
24}
25
26impl UpdateManifest {
27 pub fn for_current_platform(&self) -> Option<&UpdateData> {
28 if cfg!(target_os = "macos") {
29 self.macos.as_ref()
30 } else if cfg!(target_os = "linux") {
31 self.linux.as_ref()
32 } else if cfg!(target_arch = "x86") {
33 self.x86.as_ref()
34 } else if cfg!(target_arch = "x86_64") {
35 self.x64.as_ref()
36 } else {
37 None
38 }
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn test_update_data_new() {
48 let version = Version::parse("1.2.3").unwrap();
49 let url = "https://example.com/update.zip".to_string();
50 let update_data = UpdateData::new(version.clone(), url.clone());
51
52 assert_eq!(update_data.version, version);
53 assert_eq!(update_data.url, url);
54 }
55
56 #[test]
57 fn test_update_data_url() {
58 let version = Version::parse("1.0.0").unwrap();
59 let url = "https://example.com/update.zip".to_string();
60 let update_data = UpdateData::new(version, url.clone());
61
62 assert_eq!(update_data.url(), &url);
63 }
64
65 #[test]
66 fn test_update_manifest_for_current_platform() {
67 let version = Version::parse("1.0.0").unwrap();
68 let url = "https://example.com/update.zip".to_string();
69
70 let x64_data = UpdateData::new(version.clone(), url.clone());
71 let x86_data = UpdateData::new(version.clone(), url.clone());
72 let macos_data = UpdateData::new(version.clone(), url.clone());
73 let linux_data = UpdateData::new(version, url);
74
75 let manifest = UpdateManifest {
76 x64: Some(x64_data),
77 x86: Some(x86_data),
78 macos: Some(macos_data),
79 linux: Some(linux_data),
80 };
81
82 let result = manifest.for_current_platform();
84 assert!(result.is_some(), "Should return Some for current platform");
85 }
86
87 #[test]
88 fn test_update_manifest_for_current_platform_none() {
89 let manifest = UpdateManifest {
90 x64: None,
91 x86: None,
92 macos: None,
93 linux: None,
94 };
95
96 let result = manifest.for_current_platform();
97 assert!(result.is_none() || result.is_some());
100 }
101
102 #[test]
103 fn test_update_manifest_serialize_deserialize() {
104 let version = Version::parse("2.1.0").unwrap();
105 let url = "https://example.com/v2.1.0.zip".to_string();
106
107 let x64_data = UpdateData::new(version, url);
108 let manifest = UpdateManifest {
109 x64: Some(x64_data),
110 x86: None,
111 macos: None,
112 linux: None,
113 };
114
115 let json = serde_json::to_string(&manifest).unwrap();
116 let deserialized: UpdateManifest = serde_json::from_str(&json).unwrap();
117
118 assert!(deserialized.x64.is_some());
119 assert_eq!(deserialized.x64.as_ref().unwrap().version.to_string(), "2.1.0");
120 assert!(deserialized.x86.is_none());
121 }
122}