Documentation
use std::io::{self, Read};
use std::io::ErrorKind::InvalidData;


use crate::MAX_MESSAGE_LEN;

pub fn read_block(reader: &mut impl Read, max_len: Option<usize>) -> io::Result<Vec<u8>> {
    let mut len_bytes = [0u8; 4];
    reader.read_exact(&mut len_bytes)?;

    let len = u32::from_le_bytes(len_bytes) as usize;

    if len < 5 || len > max_len.unwrap_or(MAX_MESSAGE_LEN) {
        return Err(io::Error::new(InvalidData, format!("Invalid length of {}", len)))
    }

    let mut buf = vec![0u8; len];

    reader.read_exact(&mut buf[4..])?;

    buf[..4].clone_from_slice(&len_bytes);

    assert!(len == buf.len());

    Ok(buf)
}

#[cfg(test)]
mod tests {
    use std::io::Cursor;

    use crate::nson::msg;
    use super::read_block;

    #[test]
    fn test_read_block() {
        let message = msg!{
            "a": 1234,
            "b": 5678
        };
        let vec = message.to_bytes().unwrap();
        let mut reader = Cursor::new(&vec);

        let ret = read_block(&mut reader, None).unwrap();

        assert!(ret == vec);
    }
}