use crate::codecs::varint::parse_varint;
use crate::utils::Presence;
use crate::{Decoder, MltError, MltRefResult, MltResult, RawPresence};
#[inline]
pub fn take(input: &[u8], size: u32) -> MltRefResult<'_, &[u8]> {
let (value, input) = input
.split_at_checked(size.try_into()?)
.ok_or(MltError::UnableToTake(size))?;
Ok((input, value))
}
pub fn parse_string(input: &[u8]) -> MltRefResult<'_, &str> {
let (input, length) = parse_varint::<u32>(input)?;
let (input, value) = take(input, length)?;
let value = str::from_utf8(value)?;
Ok((input, value))
}
pub fn parse_u8(input: &[u8]) -> MltRefResult<'_, u8> {
if input.is_empty() {
Err(MltError::UnableToTake(1))
} else {
Ok((&input[1..], input[0]))
}
}
pub fn decode_presence<'a, T: Copy>(
presence: RawPresence<'a>,
values: Vec<T>,
dec: &mut Decoder,
) -> MltResult<Presence<'a, T>> {
let Some(bits) = presence.decode_bits(dec)? else {
return Ok(Presence::AllPresent(values));
};
let set_count = bits.count_ones();
let dense_count = values.len();
if set_count != dense_count {
return Err(MltError::PresenceValueCountMismatch(set_count, dense_count));
}
Ok(Presence::Bits { bits, values })
}