updatehub_package_schema/definitions/
install_if_different.rs1use derive_more::Display;
6use serde::Deserialize;
7
8#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Display)]
10#[serde(untagged)]
11pub enum InstallIfDifferent {
12 #[serde(deserialize_with = "deserialize_checksum")]
13 #[display("checksum")]
15 CheckSum,
16 #[display("pattern({pattern} equal to '{version}')")]
18 KnownPattern { version: String, pattern: KnownPatternKind },
19 #[display("custom pattern({} uqual to '{version}')", pattern.regexp)]
21 CustomPattern { version: String, pattern: Pattern },
22}
23
24#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Display)]
27#[serde(rename_all = "kebab-case")]
28pub enum KnownPatternKind {
29 #[display("Linux Kernel")]
31 LinuxKernel,
32 #[display("U-Boot")]
34 UBoot,
35}
36
37#[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}