use crate::msgpack_decoder::decode::{buffer::Buffer, error::DecodeError};
use crate::span::DeserializableTraceData;
use rmp::{decode, decode::RmpRead, Marker};
use std::collections::HashMap;
#[inline]
pub fn read_map<K, V, F, B>(
len: usize,
buf: &mut B,
read_pair: F,
) -> Result<HashMap<K, V>, DecodeError>
where
K: std::hash::Hash + Eq,
F: Fn(&mut B) -> Result<(K, V), DecodeError>,
{
let mut map = HashMap::with_capacity(len);
for _ in 0..len {
let (k, v) = read_pair(buf)?;
map.insert(k, v);
}
Ok(map)
}
#[inline]
pub fn read_map_len<T: DeserializableTraceData>(buf: &mut Buffer<T>) -> Result<usize, DecodeError> {
let buf = buf.as_mut_slice();
match decode::read_marker(buf)
.map_err(|_| DecodeError::InvalidFormat("Unable to read marker for map".to_owned()))?
{
Marker::FixMap(len) => Ok(len as usize),
Marker::Map16 => buf
.read_data_u16()
.map_err(|_| DecodeError::IOError)
.map(|len| len as usize),
Marker::Map32 => buf
.read_data_u32()
.map_err(|_| DecodeError::IOError)
.map(|len| len as usize),
_ => Err(DecodeError::InvalidType(
"Unable to read map from buffer".to_owned(),
)),
}
}