1use crate::Error;
2
3pub fn take_str(buffer: &mut &[u8]) -> crate::Result<String> {
4 if buffer.len() < 4 {
5 return Err(Error::BufferTooShort);
6 }
7 let size = {
8 let size_bytes: [u8; 4] = buffer[..4].try_into().map_err(|_| Error::BufferTooShort)?;
9 u32::from_ne_bytes(size_bytes)
10 } as usize;
11
12 if buffer.len() < 4 + size {
13 return Err(Error::BufferTooShort);
14 }
15
16 let result = String::from_utf8(buffer[4..4 + size].to_vec()).map_err(|_| Error::Utf8Error)?;
17
18 *buffer = &buffer[4 + size..];
19
20 Ok(result)
21}
22
23pub fn take_status_code(buffer: &mut &[u8]) -> crate::Result<u32> {
24 if buffer.len() < 4 {
25 return Err(Error::BufferTooShort);
26 }
27 let code = {
28 let size_bytes: [u8; 4] = buffer[..4].try_into().map_err(|_| Error::BufferTooShort)?;
29 u32::from_ne_bytes(size_bytes)
30 };
31
32 *buffer = &buffer[4..];
33
34 Ok(code)
35}