#[cfg(feature = "nix-compat-derive")] use nix_compat_derive::nix_serialize_remote; use super::{Error, NixSerialize, NixWrite}; impl NixSerialize for u64 { async fn serialize<W>(&self, writer: &mut W) -> Result<(), W::Error> where W: NixWrite, { writer.write_number(*self).await } } impl NixSerialize for usize { async fn serialize<W>(&self, writer: &mut W) -> Result<(), W::Error> where W: NixWrite, { let v = (*self).try_into().map_err(W::Error::unsupported_data)?; writer.write_number(v).await } } #[cfg(feature = "nix-compat-derive")] nix_serialize_remote!( #[nix(into = "u64")] u8 ); #[cfg(feature = "nix-compat-derive")] nix_serialize_remote!( #[nix(into = "u64")] u16 ); #[cfg(feature = "nix-compat-derive")] nix_serialize_remote!( #[nix(into = "u64")] u32 ); impl NixSerialize for bool { async fn serialize<W>(&self, writer: &mut W) -> Result<(), W::Error> where W: NixWrite, { if *self { writer.write_number(1).await } else { writer.write_number(0).await } } } impl NixSerialize for i64 { async fn serialize<W>(&self, writer: &mut W) -> Result<(), W::Error> where W: NixWrite, { writer.write_number(*self as u64).await } } #[cfg(test)] mod test { use hex_literal::hex; use rstest::rstest; use tokio::io::AsyncWriteExt as _; use tokio_test::io::Builder; use crate::wire::ser::{NixWrite, NixWriter}; #[rstest] #[case::simple_false(false, &hex!("0000 0000 0000 0000"))] #[case::simple_true(true, &hex!("0100 0000 0000 0000"))] #[tokio::test] async fn test_write_bool(#[case] value: bool, #[case] expected: &[u8]) { let mock = Builder::new().write(expected).build(); let mut writer = NixWriter::new(mock); writer.write_value(&value).await.unwrap(); writer.flush().await.unwrap(); } #[rstest] #[case::zero(0, &hex!("0000 0000 0000 0000"))] #[case::one(1, &hex!("0100 0000 0000 0000"))] #[case::other(0x563412, &hex!("1234 5600 0000 0000"))] #[case::max_value(u64::MAX, &hex!("FFFF FFFF FFFF FFFF"))] #[tokio::test] async fn test_write_u64(#[case] value: u64, #[case] expected: &[u8]) { let mock = Builder::new().write(expected).build(); let mut writer = NixWriter::new(mock); writer.write_value(&value).await.unwrap(); writer.flush().await.unwrap(); } #[rstest] #[case::zero(0, &hex!("0000 0000 0000 0000"))] #[case::one(1, &hex!("0100 0000 0000 0000"))] #[case::other(0x563412, &hex!("1234 5600 0000 0000"))] #[case::max_value(usize::MAX, &usize::MAX.to_le_bytes())] #[tokio::test] async fn test_write_usize(#[case] value: usize, #[case] expected: &[u8]) { let mock = Builder::new().write(expected).build(); let mut writer = NixWriter::new(mock); writer.write_value(&value).await.unwrap(); writer.flush().await.unwrap(); } }