Skip to main content

updatehub_package_schema/definitions/
install_if_different.rs

1// Copyright (C) 2019 O.S. Systems Sofware LTDA
2//
3// SPDX-License-Identifier: Apache-2.0
4
5use derive_more::Display;
6use serde::Deserialize;
7
8/// Handles when an object should be installed on target.
9#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Display)]
10#[serde(untagged)]
11pub enum InstallIfDifferent {
12    #[serde(deserialize_with = "deserialize_checksum")]
13    /// Use checksum to check.
14    #[display("checksum")]
15    CheckSum,
16    /// Use a predefined (known) pattern to check.
17    #[display("pattern({pattern} equal to '{version}')")]
18    KnownPattern { version: String, pattern: KnownPatternKind },
19    /// Use a custom pattern to check.
20    #[display("custom pattern({} uqual to '{version}')", pattern.regexp)]
21    CustomPattern { version: String, pattern: Pattern },
22}
23
24/// Known patterns to be used with
25/// [`InstallIfDifferent`](InstallIfDifferent::KnownPattern)
26#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Display)]
27#[serde(rename_all = "kebab-case")]
28pub enum KnownPatternKind {
29    /// Linux Kernel pattern.
30    #[display("Linux Kernel")]
31    LinuxKernel,
32    /// U-Boot pattern
33    #[display("U-Boot")]
34    UBoot,
35}
36
37/// Custom pattern to use with
38/// [`InstallIfDifferent`](InstallIfDifferent::CustomPattern)
39#[derive(Clone, PartialEq, Eq, Debug, Deserialize)]
40#[serde(rename_all = "kebab-case")]
41pub struct Pattern {
42    pub regexp: String,
43    pub seek: u64,
44    pub buffer_size: u64,
45}
46
47fn deserialize_checksum<'de, D>(deserializer: D) -> Result<(), D::Error>
48where
49    D: serde::Deserializer<'de>,
50{
51    match String::deserialize(deserializer)?.to_lowercase().as_str() {
52        "sha256sum" => Ok(()),
53        s => Err(serde::de::Error::custom(format!("Not a vliad CheckSum format: {s}"))),
54    }
55}
56
57#[cfg(test)]
58mod test {
59    use super::*;
60    use pretty_assertions::assert_eq;
61    use serde_json::json;
62
63    #[test]
64    fn deserialize() {
65        assert_eq!(
66            InstallIfDifferent::CheckSum,
67            serde_json::from_value::<InstallIfDifferent>(json!("sha256sum")).unwrap()
68        );
69        assert_eq!(
70            InstallIfDifferent::CustomPattern {
71                version: "2.0".to_string(),
72                pattern: Pattern { regexp: "[0-9.]+".to_string(), seek: 1024, buffer_size: 2048 }
73            },
74            serde_json::from_value::<InstallIfDifferent>(json!({
75                "version": "2.0",
76                "pattern": {
77                    "regexp": "[0-9.]+",
78                    "seek": 1024,
79                    "buffer-size": 2048
80                }
81            }))
82            .unwrap()
83        );
84        assert_eq!(
85            InstallIfDifferent::KnownPattern {
86                version: "4.7.4-1-ARCH".to_string(),
87                pattern: KnownPatternKind::LinuxKernel,
88            },
89            serde_json::from_value::<InstallIfDifferent>(json!({
90                "version": "4.7.4-1-ARCH",
91                "pattern": "linux-kernel"
92            }))
93            .unwrap()
94        );
95    }
96}