use serde::de::{self, MapAccess};
use serde::Deserialize;
pub(crate) fn is_zero_sized<T>(_: &T) -> bool {
std::mem::size_of::<T>() == 0
}
pub(crate) fn collect_field<'de, T, M>(
slot: &mut Option<T>,
name: &'static str,
map: &mut M,
) -> Result<(), M::Error>
where
T: Deserialize<'de>,
M: MapAccess<'de>,
{
if slot.is_some() {
return Err(de::Error::duplicate_field(name));
}
*slot = Some(map.next_value()?);
Ok(())
}
pub(crate) fn take_required<T, E>(slot: Option<T>, name: &'static str) -> Result<T, E>
where
E: de::Error,
{
slot.ok_or_else(|| E::missing_field(name))
}
pub(crate) fn skip_unknown<'de, M>(map: &mut M) -> Result<(), M::Error>
where
M: MapAccess<'de>,
{
let _ = map.next_value::<de::IgnoredAny>()?;
Ok(())
}