updatehub_package_schema/
update_package.rs

1// Copyright (C) 2020 O.S. Systems Sofware LTDA
2//
3// SPDX-License-Identifier: Apache-2.0
4
5use 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}