swarmhive_api_types/
update.rs1use serde::{Deserialize, Serialize};
9use utoipa::ToSchema;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
13#[serde(rename_all = "lowercase")]
14pub enum UpgradeType {
15 Prompt,
16 Force,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
22pub struct TauriUpdateExtensions {
23 pub upgrade_type: UpgradeType,
24 #[serde(skip_serializing_if = "Option::is_none")]
26 pub min_version: Option<String>,
27 pub rollout_percent: i16,
29 pub channel: String,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
38pub struct TauriUpdateResponse {
39 pub version: String,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub pub_date: Option<String>,
42 pub url: String,
43 pub signature: String,
44 #[serde(skip_serializing_if = "Option::is_none")]
45 pub notes: Option<String>,
46 pub swarmhive: TauriUpdateExtensions,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
56pub struct AndroidUpdateResponse {
57 pub has_update: bool,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 pub version_name: Option<String>,
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub version_code: Option<i64>,
62 #[serde(skip_serializing_if = "Option::is_none")]
63 pub upgrade_type: Option<UpgradeType>,
64 #[serde(skip_serializing_if = "Option::is_none")]
66 pub min_version_code: Option<i64>,
67 #[serde(skip_serializing_if = "Option::is_none")]
68 pub download_url: Option<String>,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 pub release_notes: Option<String>,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub size_bytes: Option<i64>,
73 #[serde(skip_serializing_if = "Option::is_none")]
74 pub sha256: Option<String>,
75}
76
77impl AndroidUpdateResponse {
78 pub fn no_update() -> Self {
80 Self {
81 has_update: false,
82 version_name: None,
83 version_code: None,
84 upgrade_type: None,
85 min_version_code: None,
86 download_url: None,
87 release_notes: None,
88 size_bytes: None,
89 sha256: None,
90 }
91 }
92}
93
94#[cfg(test)]
95mod tests {
96 use super::*;
97
98 #[test]
99 fn upgrade_type_wire_is_lowercase() {
100 assert_eq!(
101 serde_json::to_string(&UpgradeType::Prompt).unwrap(),
102 "\"prompt\""
103 );
104 assert_eq!(
105 serde_json::to_string(&UpgradeType::Force).unwrap(),
106 "\"force\""
107 );
108 assert_eq!(
109 serde_json::from_str::<UpgradeType>("\"force\"").unwrap(),
110 UpgradeType::Force
111 );
112 }
113
114 #[test]
115 fn android_no_update_serializes_minimally() {
116 let v = serde_json::to_value(AndroidUpdateResponse::no_update()).unwrap();
118 assert_eq!(v, serde_json::json!({ "has_update": false }));
119 }
120}