vtcode_desktop_protocol/
update.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10pub struct UpdateStatusSnapshot {
11 pub current_version: String,
13 #[serde(default, skip_serializing_if = "Option::is_none")]
15 pub latest_version: Option<String>,
16 #[serde(default)]
18 pub update_available: bool,
19 #[serde(default, skip_serializing_if = "Option::is_none")]
21 pub release_url: Option<String>,
22 #[serde(default, skip_serializing_if = "Vec::is_empty")]
26 pub release_highlights: Vec<String>,
27 #[serde(default, skip_serializing_if = "Vec::is_empty")]
31 pub current_release_highlights: Vec<String>,
32 #[serde(default, skip_serializing_if = "Option::is_none")]
35 pub current_release_url: Option<String>,
36 #[serde(default)]
40 pub current_release_seen: bool,
41 #[serde(default, skip_serializing_if = "Option::is_none")]
43 pub channel: Option<String>,
44 #[serde(default)]
46 pub check_due: bool,
47}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52
53 #[test]
54 fn update_status_snapshot_round_trips_and_older_payloads_decode() {
55 let snapshot = UpdateStatusSnapshot {
56 current_version: "0.180.5".into(),
57 latest_version: Some("0.181.0".into()),
58 update_available: true,
59 release_url: Some("https://github.com/vinhnx/vtcode/releases/tag/v0.181.0".into()),
60 release_highlights: vec!["Faster startup".into(), "New model picker".into()],
61 current_release_highlights: vec!["Older highlight".into()],
62 current_release_url: Some("https://github.com/vinhnx/vtcode/releases/tag/v0.180.5".into()),
63 current_release_seen: true,
64 channel: Some("stable".into()),
65 check_due: false,
66 };
67 let decoded: UpdateStatusSnapshot = serde_json::from_value(serde_json::to_value(&snapshot).unwrap()).unwrap();
68 assert_eq!(decoded, snapshot);
69
70 let quiet = UpdateStatusSnapshot {
74 current_version: "0.181.0".into(),
75 latest_version: None,
76 update_available: false,
77 release_url: None,
78 release_highlights: Vec::new(),
79 current_release_highlights: vec!["Freshly installed".into()],
80 current_release_url: Some("https://github.com/vinhnx/vtcode/releases/tag/v0.181.0".into()),
81 current_release_seen: false,
82 channel: None,
83 check_due: true,
84 };
85 let decoded_quiet: UpdateStatusSnapshot =
86 serde_json::from_value(serde_json::to_value(&quiet).unwrap()).unwrap();
87 assert_eq!(decoded_quiet, quiet);
88
89 let legacy: UpdateStatusSnapshot =
90 serde_json::from_value(serde_json::json!({ "currentVersion": "0.179.0" })).unwrap();
91 assert_eq!(legacy.current_version, "0.179.0");
92 assert!(legacy.latest_version.is_none());
93 assert!(!legacy.update_available);
94 assert!(legacy.release_url.is_none());
95 assert!(legacy.release_highlights.is_empty());
96 assert!(legacy.current_release_highlights.is_empty());
97 assert!(legacy.current_release_url.is_none());
98 assert!(!legacy.current_release_seen);
99 assert!(legacy.channel.is_none());
100 assert!(!legacy.check_due);
101 }
102}