use anyhow::{bail, Result};
use bytes::{BufMut, Bytes, BytesMut};
pub fn write(in_buf: &[u8], out_buf: &mut BytesMut, description: &str) -> Result<()> {
if in_buf.len() > 255 {
bail!(
"{} length {} exceeds maximum 255",
description,
in_buf.len()
);
}
out_buf.reserve(1 + in_buf.len());
out_buf.put_u8(in_buf.len() as u8);
out_buf.put_slice(&in_buf);
return Ok(());
}
pub fn read(in_buf: &[u8], original_offset: usize, description: &str) -> Result<(usize, Bytes)> {
let mut offset = original_offset;
let mut out = BytesMut::new();
if in_buf.len() < offset + 1 {
bail!("{} is empty, expected string size", description);
}
let label_size = in_buf[offset] as usize;
offset += 1;
if in_buf.len() < offset + label_size {
bail!(
"{} remaining buffer length {} is shorter than required offset {} + string {}",
description,
in_buf.len(),
offset,
label_size
);
}
out.extend_from_slice(&in_buf[offset..offset + label_size]);
return Ok((1 + label_size, out.freeze()));
}