nix_compat/wire/ser/
int.rs1use 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}