tcp_struct/
util.rs

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}