ranch 0.6.0

Ranged integer types and math
Documentation
use serde_core::{Deserialize, Deserializer, Serialize, Serializer, de::Error};

use crate::*;

macro_rules! impl_serde {
    ($type:ident, $p:ty) => {
        impl<'de, const MIN: $p, const MAX: $p> Deserialize<'de>
            for $type<MIN, MAX>
        {
            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
            where
                D: Deserializer<'de>,
            {
                <$p as Deserialize>::deserialize(deserializer)?
                    .try_into()
                    .map_err(Error::custom)
            }
        }

        impl<const MIN: $p, const MAX: $p> Serialize for $type<MIN, MAX> {
            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
            where
                S: Serializer,
            {
                <$p as Serialize>::serialize(&self.get(), serializer)
            }
        }
    };
}

macro_rules! impl_serde_nonzero {
    ($type:ident, $p:ty, $r:ident) => {
        impl<'de, const MIN: $p, const MAX: $p> Deserialize<'de>
            for $type<MIN, MAX>
        {
            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
            where
                D: Deserializer<'de>,
            {
                let r: $r<MIN, MAX> =
                    <$p as Deserialize>::deserialize(deserializer)?
                        .try_into()
                        .map_err(Error::custom)?;

                r.to_ranged_nonzero()
                    .ok_or("must not be zero")
                    .map_err(Error::custom)
            }
        }

        impl<const MIN: $p, const MAX: $p> Serialize for $type<MIN, MAX> {
            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
            where
                S: Serializer,
            {
                <$p as Serialize>::serialize(&self.get(), serializer)
            }
        }
    };
}

impl_serde!(RangedU8, u8);
impl_serde!(RangedU16, u16);
impl_serde!(RangedU32, u32);
impl_serde!(RangedU64, u64);
impl_serde!(RangedU128, u128);

impl_serde!(RangedI8, i8);
impl_serde!(RangedI16, i16);
impl_serde!(RangedI32, i32);
impl_serde!(RangedI64, i64);
impl_serde!(RangedI128, i128);

impl_serde_nonzero!(RangedNonZeroU8, u8, RangedU8);
impl_serde_nonzero!(RangedNonZeroU16, u16, RangedU16);
impl_serde_nonzero!(RangedNonZeroU32, u32, RangedU32);
impl_serde_nonzero!(RangedNonZeroU64, u64, RangedU64);
impl_serde_nonzero!(RangedNonZeroU128, u128, RangedU128);

impl_serde_nonzero!(RangedNonZeroI8, i8, RangedI8);
impl_serde_nonzero!(RangedNonZeroI16, i16, RangedI16);
impl_serde_nonzero!(RangedNonZeroI32, i32, RangedI32);
impl_serde_nonzero!(RangedNonZeroI64, i64, RangedI64);
impl_serde_nonzero!(RangedNonZeroI128, i128, RangedI128);