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}