size-limit 0.1.0

range limit checker
Documentation
use std::ops::Deref;

use serde::{Serialize, de};

use crate::{measurable::Measurable, RangeBoundLimit, RangeBound};

trait SerdeProc {
    type ToSerde: Measurable+serde::Serialize;
    fn into_serde(&self) -> &Self::ToSerde;
}

struct Normal<T>(T);

impl<T: Measurable+Serialize> SerdeProc for Normal<T> {
    type ToSerde = T;

    fn into_serde(&self) -> &Self::ToSerde {
        &self.0
    }
}



struct SmartPtr<P, T>(P)
where
    P: Deref<Target = T>;

impl<P, T> SerdeProc for SmartPtr<P, T>
where
    P: Deref<Target = T>,
    T: Measurable+Serialize,
{
    type ToSerde = T;

    fn into_serde(&self) -> &Self::ToSerde {
        self.0.deref()
    }
}

impl<T: serde::Serialize, Rb> serde::Serialize for RangeBoundLimit<T, Rb> {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        self.0.serialize(serializer)
    }
}

impl<'de, T, Rb> serde::Deserialize<'de> for RangeBoundLimit<T, Rb>
where
    T: serde::Deserialize<'de> + Measurable,
    Rb: RangeBound,
{
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let tmp = T::deserialize(deserializer)?;
        Self::try_from(tmp).or_else(|e| Err(de::Error::custom(e)))
    }
}