serde_untagged/
seed.rs

1use crate::any::ErasedValue;
2use alloc::boxed::Box;
3use serde::de::{DeserializeSeed, Deserializer};
4
5pub(crate) trait ErasedDeserializeSeed<'de> {
6    fn erased_deserialize(
7        &mut self,
8        deserializer: Box<dyn erased_serde::Deserializer<'de> + '_>,
9    ) -> Result<ErasedValue, erased_serde::Error>;
10}
11
12impl<'de, Seed> ErasedDeserializeSeed<'de> for Option<Seed>
13where
14    Seed: DeserializeSeed<'de>,
15{
16    fn erased_deserialize(
17        &mut self,
18        deserializer: Box<dyn erased_serde::Deserializer<'de> + '_>,
19    ) -> Result<ErasedValue, erased_serde::Error> {
20        self.take()
21            .unwrap()
22            .deserialize(deserializer)
23            .map(|value| unsafe { ErasedValue::new::<Seed::Value>(value) })
24    }
25}
26
27impl<'de> DeserializeSeed<'de> for &mut dyn ErasedDeserializeSeed<'de> {
28    type Value = ErasedValue;
29
30    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
31    where
32        D: Deserializer<'de>,
33    {
34        let deserializer = Box::new(<dyn erased_serde::Deserializer>::erase(deserializer));
35        self.erased_deserialize(deserializer)
36            .map_err(serde::de::Error::custom)
37    }
38}