Skip to main content

nix_compat/wire/ser/
int.rs

1use super::{Error, NixSerialize, NixWrite};
2
3impl NixSerialize for u64 {
4    async fn serialize<W>(&self, writer: &mut W) -> Result<(), W::Error>
5    where
6        W: NixWrite,
7    {
8        writer.write_number(*self).await
9    }
10}
11
12impl NixSerialize for usize {
13    async fn serialize<W>(&self, writer: &mut W) -> Result<(), W::Error>
14    where
15        W: NixWrite,
16    {
17        let v = (*self).try_into().map_err(W::Error::unsupported_data)?;
18        writer.write_number(v).await
19    }
20}
21
22impl NixSerialize for bool {
23    async fn serialize<W>(&self, writer: &mut W) -> Result<(), W::Error>
24    where
25        W: NixWrite,
26    {
27        if *self {
28            writer.write_number(1).await
29        } else {
30            writer.write_number(0).await
31        }
32    }
33}
34
35#[cfg(test)]
36mod test {
37    use hex_literal::hex;
38    use rstest::rstest;
39    use tokio::io::AsyncWriteExt as _;
40    use tokio_test::io::Builder;
41
42    use crate::wire::ser::{NixWrite, NixWriter};
43
44    #[rstest]
45    #[case::simple_false(false, &hex!("0000 0000 0000 0000"))]
46    #[case::simple_true(true, &hex!("0100 0000 0000 0000"))]
47    #[tokio::test]
48    async fn test_write_bool(#[case] value: bool, #[case] expected: &[u8]) {
49        let mock = Builder::new().write(expected).build();
50        let mut writer = NixWriter::new(mock);
51        writer.write_value(&value).await.unwrap();
52        writer.flush().await.unwrap();
53    }
54
55    #[rstest]
56    #[case::zero(0, &hex!("0000 0000 0000 0000"))]
57    #[case::one(1, &hex!("0100 0000 0000 0000"))]
58    #[case::other(0x563412, &hex!("1234 5600 0000 0000"))]
59    #[case::max_value(u64::MAX, &hex!("FFFF FFFF FFFF FFFF"))]
60    #[tokio::test]
61    async fn test_write_u64(#[case] value: u64, #[case] expected: &[u8]) {
62        let mock = Builder::new().write(expected).build();
63        let mut writer = NixWriter::new(mock);
64        writer.write_value(&value).await.unwrap();
65        writer.flush().await.unwrap();
66    }
67
68    #[rstest]
69    #[case::zero(0, &hex!("0000 0000 0000 0000"))]
70    #[case::one(1, &hex!("0100 0000 0000 0000"))]
71    #[case::other(0x563412, &hex!("1234 5600 0000 0000"))]
72    #[case::max_value(usize::MAX, &usize::MAX.to_le_bytes())]
73    #[tokio::test]
74    async fn test_write_usize(#[case] value: usize, #[case] expected: &[u8]) {
75        let mock = Builder::new().write(expected).build();
76        let mut writer = NixWriter::new(mock);
77        writer.write_value(&value).await.unwrap();
78        writer.flush().await.unwrap();
79    }
80}