Skip to main content

updatehub_package_schema/definitions/
chunk_size.rs

1// Copyright (C) 2019 O.S. Systems Sofware LTDA
2//
3// SPDX-License-Identifier: Apache-2.0
4
5use serde::{Deserialize, Deserializer, de};
6
7/// The size of the buffers (in bytes) used to read and write,
8/// default is the 128KiB.
9#[derive(Clone, PartialEq, Eq, Debug)]
10pub struct ChunkSize(pub usize);
11
12impl Default for ChunkSize {
13    fn default() -> Self {
14        ChunkSize(131_072)
15    }
16}
17
18impl<'de> Deserialize<'de> for ChunkSize {
19    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
20    where
21        D: Deserializer<'de>,
22    {
23        let n = usize::deserialize(deserializer)?;
24        if n > 1 {
25            return Ok(ChunkSize(n));
26        }
27        Err(de::Error::custom(format!("Invalid chunk size: {n}")))
28    }
29}
30
31#[cfg(test)]
32mod test {
33    use super::*;
34    use pretty_assertions::assert_eq;
35    use serde_json::json;
36
37    #[derive(Debug, PartialEq, Eq, Deserialize)]
38    struct Payload {
39        #[serde(default)]
40        chunk_size: ChunkSize,
41    }
42
43    #[test]
44    fn deserialize() {
45        assert_eq!(
46            serde_json::from_value::<Payload>(json!({ "chunk_size": 313 })).ok(),
47            Some(Payload { chunk_size: ChunkSize(313) })
48        );
49        assert!(serde_json::from_value::<Payload>(json!({ "chunk_size": 0 })).is_err());
50    }
51
52    #[test]
53    fn default() {
54        assert_eq!(
55            serde_json::from_value::<Payload>(json!({})).ok(),
56            Some(Payload { chunk_size: ChunkSize(131_072) })
57        );
58    }
59}