1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
use nom::IResult; use nom::number::complete::le_u32; use nom::bytes::complete::{take,take_till}; use nom::combinator::all_consuming; use super::Error; pub fn decode_rle_string(input: &[u8]) -> IResult<&[u8], String, Error> { let (input, size) = le_u32(input)?; let (input, string) = take(size as usize)(input)?; let (_, string) = all_consuming(decode_bytes_as_utf8_string)(&string)?; Ok((input, string)) } pub fn decode_null_terminated_string(input: &[u8]) -> IResult<&[u8], String, Error> { let (input, string) = take_till(|c| c == b'\0')(input)?; let (_, string) = all_consuming(decode_bytes_as_utf8_string)(&string)?; Ok((input, string)) } pub fn decode_bytes_as_utf8_string(input: &[u8]) -> IResult<&[u8], String, Error> { match String::from_utf8(input.to_vec()) { Ok(string) => Ok((b"", string)), Err(_error) => Err(nom::Err::Error(Error::Utf8Error)) } }