falco_event/types/
bytebuf.rs

1use crate::fields::{FromBytes, FromBytesError, ToBytes};
2use std::io::Write;
3
4impl<'a> FromBytes<'a> for &'a [u8] {
5    #[inline]
6    fn from_bytes(buf: &mut &'a [u8]) -> Result<Self, FromBytesError> {
7        Ok(std::mem::take(buf))
8    }
9}
10
11impl ToBytes for &[u8] {
12    #[inline]
13    fn binary_size(&self) -> usize {
14        self.len()
15    }
16
17    #[inline]
18    fn write<W: Write>(&self, mut writer: W) -> std::io::Result<()> {
19        writer.write_all(self)
20    }
21
22    #[inline]
23    fn default_repr() -> impl ToBytes {
24        &[] as &[u8]
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use crate::fields::{FromBytes, ToBytes};
31
32    #[test]
33    fn test_bytebuf() {
34        let data = b"foo".as_slice();
35        let mut binary = Vec::new();
36
37        data.write(&mut binary).unwrap();
38        println!("{binary:02x?}");
39
40        assert_eq!(binary.as_slice(), "foo".as_bytes());
41
42        let mut buf = binary.as_slice();
43        let loaded = <&[u8]>::from_bytes(&mut buf).unwrap();
44        assert_eq!(loaded, "foo".as_bytes());
45    }
46
47    #[test]
48    fn test_bytebuf_inner_nul() {
49        let data = b"f\0oo".as_slice();
50        let mut binary = Vec::new();
51
52        data.write(&mut binary).unwrap();
53        println!("{binary:02x?}");
54
55        assert_eq!(binary.as_slice(), "f\0oo".as_bytes());
56
57        let mut buf = binary.as_slice();
58        let loaded = <&[u8]>::from_bytes(&mut buf).unwrap();
59        assert_eq!(loaded, "f\0oo".as_bytes());
60    }
61}