serde_combinators/
ref_.rs1use super::{compose_deserialize, compose_serialize, DeserializeWith, SerializeWith};
2use serde::{Deserializer, Serializer};
3use std::marker::PhantomData;
4
5pub struct RefF<'a, W>(PhantomData<&'a W>);
6
7impl<'a, W> SerializeWith for RefF<'a, W>
8where
9 W: SerializeWith,
10{
11 type T = &'a W::T;
12
13 fn serialize<S>(value: &Self::T, serializer: S) -> Result<S::Ok, S::Error>
14 where
15 S: Serializer,
16 {
17 compose_serialize(
18 |value, serializer, serialize| serialize(value, serializer),
19 W::serialize,
20 )(value, serializer)
21 }
22}
23
24impl<'a, W> DeserializeWith for RefF<'a, W>
25where
26 W: DeserializeWith,
27{
28 type T = &'a W::T;
29
30 fn deserialize<'de, D>(deserializer: D) -> Result<Self::T, D::Error>
31 where
32 D: Deserializer<'de>,
33 {
34 compose_deserialize(W::deserialize, |value| Ok(Box::leak(Box::new(value)) as &_))(
35 deserializer,
36 )
37 }
38}