updatehub_package_schema/
update_package.rs1use serde::Deserialize;
6
7#[derive(Clone, Debug, PartialEq, Eq, Deserialize)]
8pub struct UpdatePackage {
9 #[serde(rename = "product")]
10 pub product_uid: String,
11 pub version: String,
12 #[serde(default, rename = "supported-hardware")]
13 pub supported_hardware: SupportedHardware,
14 pub objects: (Vec<crate::Object>, Vec<crate::Object>),
15}
16
17#[derive(Clone, Debug, PartialEq, Eq, Deserialize)]
18#[serde(untagged)]
19#[derive(Default)]
20pub enum SupportedHardware {
21 #[serde(deserialize_with = "any")]
22 #[default]
23 Any,
24 HardwareList(Vec<String>),
25}
26
27fn any<'de, D: serde::de::Deserializer<'de>>(deserializer: D) -> Result<(), D::Error> {
28 if String::deserialize(deserializer)? == "any" {
29 Ok(())
30 } else {
31 Err(serde::de::Error::custom("expected \"any\""))
32 }
33}
34
35#[cfg(test)]
36mod tests {
37 use super::*;
38 use pretty_assertions::assert_eq;
39 use serde_json::json;
40
41 #[test]
42 fn no_hardware() {
43 assert!(serde_json::from_str::<SupportedHardware>("").is_err());
44 }
45
46 #[test]
47 fn any_hardware() {
48 assert_eq!(
49 SupportedHardware::Any,
50 serde_json::from_str::<SupportedHardware>(&json!("any").to_string()).unwrap()
51 );
52 }
53
54 #[test]
55 fn one_hardware() {
56 assert_eq!(
57 SupportedHardware::HardwareList(vec!["hw".to_string()]),
58 serde_json::from_str::<SupportedHardware>(&json!(["hw"]).to_string()).unwrap()
59 );
60 }
61
62 #[test]
63 fn many_hardware() {
64 assert_eq!(
65 SupportedHardware::HardwareList(vec!["hw-1".into(), "hw-2".into()]),
66 serde_json::from_str::<SupportedHardware>(&json!(["hw-1", "hw-2"]).to_string())
67 .unwrap()
68 );
69 }
70}