Skip to main content

refining_core/
serde.rs

1//! Implementations of [`Serialize`] and [`Deserialize`] for [`Refinement`].
2
3#[cfg(not(feature = "serde"))]
4compile_error!("expected `serde` to be enabled");
5
6use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error};
7
8use crate::{
9    predicate::Predicate,
10    refinement::{Refine, Refinement},
11    types::TypeStr,
12};
13
14impl<T: Serialize + ?Sized, P: Predicate<T> + ?Sized, C: TypeStr + ?Sized> Serialize
15    for Refinement<T, P, C>
16{
17    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
18        self.get_ref().serialize(serializer)
19    }
20}
21
22impl<'de, T: Deserialize<'de>, P: Predicate<T> + ?Sized, C: TypeStr + ?Sized> Deserialize<'de>
23    for Refinement<T, P, C>
24{
25    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
26        let value = T::deserialize(deserializer)?;
27
28        let refined = value.refine().map_err(D::Error::custom)?;
29
30        Ok(refined)
31    }
32}