sharing/
types.rs

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        // The result depends on the current platform
83        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        // This will be None if no platform matches, or Some if one does
98        // The test just verifies the function doesn't panic
99        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}