tinybmp/
parser.rs

1use crate::ParseError;
2
3pub fn take<const N: usize>(input: &[u8]) -> Result<(&[u8], [u8; N]), ParseError> {
4    if let (Some(value), Some(rest)) = (input.get(0..N), input.get(N..)) {
5        Ok((rest, value.try_into().unwrap()))
6    } else {
7        Err(ParseError::UnexpectedEndOfFile)
8    }
9}
10
11pub fn take_slice(input: &[u8], length: usize) -> Result<(&[u8], &[u8]), ParseError> {
12    if let (Some(value), Some(rest)) = (input.get(0..length), input.get(length..)) {
13        Ok((rest, value))
14    } else {
15        Err(ParseError::UnexpectedEndOfFile)
16    }
17}
18
19pub fn le_u16(input: &[u8]) -> Result<(&[u8], u16), ParseError> {
20    let (input, value) = take::<2>(input)?;
21    Ok((input, u16::from_le_bytes(value)))
22}
23
24pub fn le_u32(input: &[u8]) -> Result<(&[u8], u32), ParseError> {
25    let (input, value) = take::<4>(input)?;
26    Ok((input, u32::from_le_bytes(value)))
27}
28
29pub fn le_i32(input: &[u8]) -> Result<(&[u8], i32), ParseError> {
30    le_u32(input).map(|(input, value)| (input, value as i32))
31}