use serde::Deserializer;
use serde::de::DeserializeSeed;
use serde::de::Error;
use serde_json::Value;
use super::JsonStructureVisitor;
use crate::runtime::JsonStructureAdmission;
pub(crate) struct JsonStructureSeed<'admission, 'runtime, 'rejected> {
pub(crate) admission: &'admission mut JsonStructureAdmission<'runtime>,
pub(crate) depth: usize,
pub(crate) collection_item: bool,
pub(crate) rejected: &'rejected mut bool,
}
impl<'de> DeserializeSeed<'de> for JsonStructureSeed<'_, '_, '_> {
type Value = Value;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
if (self.collection_item && !self.admission.admit_collection_item()) || !self.admission.admit_node(self.depth) {
*self.rejected = true;
return Err(D::Error::custom("JSON structural budget rejected a value"));
}
deserializer.deserialize_any(JsonStructureVisitor {
admission: self.admission,
depth: self.depth,
rejected: self.rejected,
})
}
}