nix_compat/wire/ser/
int.rs1#[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}