use crate::Context;
use crate::de::SizeHint;
mod sealed {
pub trait Sealed {}
impl<T, M> Sealed for crate::__priv::EncodeMapHint<'_, T, M> where T: ?Sized {}
impl Sealed for usize {}
impl Sealed for Option<usize> {}
}
pub trait MapHint: Sized + self::sealed::Sealed {
fn get(self) -> Option<usize>;
#[inline]
fn require<C>(self, cx: C) -> Result<usize, C::Error>
where
C: Context,
{
let Some(size) = self.get() else {
return Err(cx.message("Format cannot handle maps with an unknown number of entries"));
};
Ok(size)
}
#[inline]
fn size_hint(self) -> SizeHint {
match self.get() {
Some(size) => SizeHint::exact(size),
None => SizeHint::any(),
}
}
}
impl MapHint for usize {
#[inline]
fn get(self) -> Option<usize> {
Some(self)
}
#[inline]
fn require<C>(self, _: C) -> Result<usize, C::Error>
where
C: Context,
{
Ok(self)
}
#[inline]
fn size_hint(self) -> SizeHint {
SizeHint::exact(self)
}
}
impl MapHint for Option<usize> {
#[inline]
fn get(self) -> Option<usize> {
self
}
}