Skip to content

Commit 444feb2

Browse files
committed
Add Error::saturate()
1 parent 51fc990 commit 444feb2

File tree

6 files changed

+65
-0
lines changed

6 files changed

+65
-0
lines changed

src/error.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,33 @@ impl fmt::Display for Error {
2828
}
2929
}
3030
}
31+
32+
impl Error {
33+
/// Saturate out of bounds values.
34+
///
35+
/// ```rust
36+
/// # use ranch::{RangedU8, Error};
37+
/// assert_eq!(
38+
/// RangedU8::<1, 3>::new(0).unwrap_or_else(Error::saturate),
39+
/// RangedU8::<1, 3>::new_const::<1>(),
40+
/// );
41+
/// assert_eq!(
42+
/// RangedU8::<1, 3>::new(4).unwrap_or_else(Error::saturate),
43+
/// RangedU8::<1, 3>::new_const::<3>(),
44+
/// );
45+
/// ```
46+
pub const fn saturate<T>(self) -> T
47+
where
48+
T: Saturate,
49+
{
50+
match self {
51+
Self::PosOverflow => T::MAX,
52+
Self::NegOverflow => T::MIN,
53+
}
54+
}
55+
}
56+
57+
pub trait Saturate {
58+
const MIN: Self;
59+
const MAX: Self;
60+
}

src/ranged_u128.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,3 +292,10 @@ impl<const MIN: u128, const MAX: u128> core::str::FromStr
292292
Self::new(parsed).map_err(From::from)
293293
}
294294
}
295+
296+
impl<const MIN: u128, const MAX: u128> crate::error::Saturate
297+
for RangedU128<MIN, MAX>
298+
{
299+
const MAX: Self = Self::MAX;
300+
const MIN: Self = Self::MIN;
301+
}

src/ranged_u16.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,3 +292,10 @@ impl<const MIN: u16, const MAX: u16> core::str::FromStr
292292
Self::new(parsed).map_err(From::from)
293293
}
294294
}
295+
296+
impl<const MIN: u16, const MAX: u16> crate::error::Saturate
297+
for RangedU16<MIN, MAX>
298+
{
299+
const MAX: Self = Self::MAX;
300+
const MIN: Self = Self::MIN;
301+
}

src/ranged_u32.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,3 +292,10 @@ impl<const MIN: u32, const MAX: u32> core::str::FromStr
292292
Self::new(parsed).map_err(From::from)
293293
}
294294
}
295+
296+
impl<const MIN: u32, const MAX: u32> crate::error::Saturate
297+
for RangedU32<MIN, MAX>
298+
{
299+
const MAX: Self = Self::MAX;
300+
const MIN: Self = Self::MIN;
301+
}

src/ranged_u64.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,3 +292,10 @@ impl<const MIN: u64, const MAX: u64> core::str::FromStr
292292
Self::new(parsed).map_err(From::from)
293293
}
294294
}
295+
296+
impl<const MIN: u64, const MAX: u64> crate::error::Saturate
297+
for RangedU64<MIN, MAX>
298+
{
299+
const MAX: Self = Self::MAX;
300+
const MIN: Self = Self::MIN;
301+
}

src/ranged_u8.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,3 +290,10 @@ impl<const MIN: u8, const MAX: u8> core::str::FromStr for RangedU8<MIN, MAX> {
290290
Self::new(parsed).map_err(From::from)
291291
}
292292
}
293+
294+
impl<const MIN: u8, const MAX: u8> crate::error::Saturate
295+
for RangedU8<MIN, MAX>
296+
{
297+
const MAX: Self = Self::MAX;
298+
const MIN: Self = Self::MIN;
299+
}

0 commit comments

Comments
 (0)