use std::cell::RefCell;
use std::rc::Rc;
use serde::Deserialize;
use serde::de::DeserializeSeed;
use serde::de::Deserializer;
use super::internal::StrictStringMapValueVisitor;
use super::strict_string_map::StrictStringMap;
use crate::MetadataError;
pub(crate) struct StrictStringMapSeed<'a, V> {
max_entries: usize,
max_key_bytes: usize,
error_slot: Option<Rc<RefCell<Option<MetadataError>>>>,
lifetime: std::marker::PhantomData<&'a ()>,
marker: std::marker::PhantomData<fn() -> V>,
}
impl<V> StrictStringMapSeed<'static, V> {
#[must_use]
#[inline]
pub(crate) const fn new(max_entries: usize, max_key_bytes: usize) -> Self {
Self {
max_entries,
max_key_bytes,
error_slot: None,
lifetime: std::marker::PhantomData,
marker: std::marker::PhantomData,
}
}
#[cfg(all(feature = "json", feature = "schema"))]
#[must_use]
#[inline]
pub(crate) fn with_error_slot(mut self, slot: Rc<RefCell<Option<MetadataError>>>) -> Self {
self.error_slot = Some(slot);
self
}
}
impl<'de, 'a, V> DeserializeSeed<'de> for StrictStringMapSeed<'a, V>
where
V: Deserialize<'de>,
{
type Value = StrictStringMap<V>;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_map(StrictStringMapValueVisitor::new(
self.max_entries,
self.max_key_bytes,
self.error_slot,
std::marker::PhantomData::<V>,
))
}
}