serde_combinators/
ref_.rs

1use 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}