Skip to main content

nix_compat/wire/de/
bytes.rs

1use bstr::BString;
2use bytes::Bytes;
3
4use super::{Error, NixDeserialize, NixRead};
5
6impl NixDeserialize for Bytes {
7    async fn try_deserialize<R>(reader: &mut R) -> Result<Option<Self>, R::Error>
8    where
9        R: ?Sized + NixRead + Send,
10    {
11        reader.try_read_bytes().await
12    }
13}
14
15impl NixDeserialize for BString {
16    async fn try_deserialize<R>(reader: &mut R) -> Result<Option<Self>, R::Error>
17    where
18        R: ?Sized + NixRead + Send,
19    {
20        Ok(reader
21            .try_read_bytes()
22            .await?
23            .map(|buf| BString::new(buf.to_vec())))
24    }
25}
26
27impl NixDeserialize for String {
28    async fn try_deserialize<R>(reader: &mut R) -> Result<Option<Self>, R::Error>
29    where
30        R: ?Sized + NixRead + Send,
31    {
32        if let Some(buf) = reader.try_read_bytes().await? {
33            String::from_utf8(buf.to_vec())
34                .map_err(R::Error::invalid_data)
35                .map(Some)
36        } else {
37            Ok(None)
38        }
39    }
40}
41
42#[cfg(test)]
43mod test {
44    use std::io;
45
46    use hex_literal::hex;
47    use rstest::rstest;
48    use tokio_test::io::Builder;
49
50    use crate::wire::de::{NixRead, NixReader};
51
52    #[rstest]
53    #[case::empty("", &hex!("0000 0000 0000 0000"))]
54    #[case::one(")", &hex!("0100 0000 0000 0000 2900 0000 0000 0000"))]
55    #[case::two("it", &hex!("0200 0000 0000 0000 6974 0000 0000 0000"))]
56    #[case::three("tea", &hex!("0300 0000 0000 0000 7465 6100 0000 0000"))]
57    #[case::four("were", &hex!("0400 0000 0000 0000 7765 7265 0000 0000"))]
58    #[case::five("where", &hex!("0500 0000 0000 0000 7768 6572 6500 0000"))]
59    #[case::six("unwrap", &hex!("0600 0000 0000 0000 756E 7772 6170 0000"))]
60    #[case::seven("where's", &hex!("0700 0000 0000 0000 7768 6572 6527 7300"))]
61    #[case::aligned("read_tea", &hex!("0800 0000 0000 0000 7265 6164 5F74 6561"))]
62    #[case::more_bytes("read_tess", &hex!("0900 0000 0000 0000 7265 6164 5F74 6573 7300 0000 0000 0000"))]
63    #[case::utf8("The quick brown 🦊 jumps over 13 lazy 🐶.", &hex!("2D00 0000 0000 0000  5468 6520 7175 6963  6b20 6272 6f77 6e20  f09f a68a 206a 756d  7073 206f 7665 7220  3133 206c 617a 7920  f09f 90b6 2e00 0000"))]
64    #[tokio::test]
65    async fn test_read_string(#[case] expected: &str, #[case] data: &[u8]) {
66        let mock = Builder::new().read(data).build();
67        let mut reader = NixReader::new(mock);
68        let actual: String = reader.read_value().await.unwrap();
69        assert_eq!(actual, expected);
70    }
71
72    #[tokio::test]
73    async fn test_read_string_invalid() {
74        let mock = Builder::new()
75            .read(&hex!("0300 0000 0000 0000 EDA0 8000 0000 0000"))
76            .build();
77        let mut reader = NixReader::new(mock);
78        assert_eq!(
79            io::ErrorKind::InvalidData,
80            reader.read_value::<String>().await.unwrap_err().kind()
81        );
82    }
83}