1use std::io::{Error, Write};
2
3use nom::bytes::complete::take;
4
5use super::*;
6
7pub fn read_var_buffer(input: &[u8]) -> IResult<&[u8], &[u8]> {
8 let (tail, len) = read_var_u64(input)?;
9 let (tail, val) = take(len as usize)(tail)?;
10 Ok((tail, val))
11}
12
13pub fn write_var_buffer<W: Write>(buffer: &mut W, data: &[u8]) -> Result<(), Error> {
14 write_var_u64(buffer, data.len() as u64)?;
15 buffer.write_all(data)?;
16 Ok(())
17}
18
19#[cfg(test)]
20mod tests {
21 use nom::{
22 AsBytes, Err,
23 error::{Error, ErrorKind},
24 };
25
26 use super::*;
27
28 #[test]
29 fn test_read_var_buffer() {
30 let input = [0x05, 0x01, 0x02, 0x03, 0x04, 0x05];
32 let expected_output = [0x01, 0x02, 0x03, 0x04, 0x05];
33 let result = read_var_buffer(&input);
34 assert_eq!(result, Ok((&[][..], &expected_output[..])));
35
36 let input = [0x05, 0x01, 0x02, 0x03];
38 let result = read_var_buffer(&input);
39 assert_eq!(result, Err(Err::Error(Error::new(&input[1..], ErrorKind::Eof))));
40
41 let input = [0xFF, 0x01, 0x02, 0x03];
43 let result = read_var_buffer(&input);
44 assert_eq!(result, Err(Err::Error(Error::new(&input[2..], ErrorKind::Eof))));
45
46 let input = [0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01];
48 let result = read_var_buffer(&input);
49 assert_eq!(result, Err(Err::Error(Error::new(&input[7..], ErrorKind::Eof))));
50 }
51
52 #[test]
53 fn test_var_buf_codec() {
54 test_var_buf_enc_dec(&[]);
55 test_var_buf_enc_dec(&[0x01, 0x02, 0x03, 0x04, 0x05]);
56 test_var_buf_enc_dec(b"test_var_buf_enc_dec");
57
58 #[cfg(not(miri))]
59 {
60 use rand::{Rng, thread_rng};
61 let mut rng = thread_rng();
62 for _ in 0..100 {
63 test_var_buf_enc_dec(&{
64 let mut bytes = vec![0u8; rng.gen_range(0..u16::MAX as usize)];
65 rng.fill(&mut bytes[..]);
66 bytes
67 });
68 }
69 }
70 }
71
72 fn test_var_buf_enc_dec(data: &[u8]) {
73 let mut buf = Vec::<u8>::new();
74 write_var_buffer(&mut buf, data).unwrap();
75 let result = read_var_buffer(buf.as_bytes());
76 assert_eq!(result, Ok((&[][..], data)));
77 }
78}