nix_compat/wire/ser/
int.rs

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