38 lines
760 B
Rust
38 lines
760 B
Rust
|
pub trait Narrow{
|
||
|
type Output;
|
||
|
fn narrow(self)->Self::Output;
|
||
|
}
|
||
|
#[derive(Debug)]
|
||
|
pub enum NarrowError{
|
||
|
Overflow,
|
||
|
Underflow,
|
||
|
}
|
||
|
pub trait TryNarrow{
|
||
|
type Output;
|
||
|
fn try_narrow(self)->Result<Self::Output,NarrowError>;
|
||
|
}
|
||
|
#[cfg(test)]
|
||
|
mod tests {
|
||
|
use super::*;
|
||
|
|
||
|
impl TryNarrow for i16{
|
||
|
type Output=i8;
|
||
|
fn try_narrow(self)->Result<Self::Output,NarrowError>{
|
||
|
if self<i8::MIN as i16{
|
||
|
return Err(NarrowError::Underflow);
|
||
|
}
|
||
|
if (i8::MAX as i16)<self{
|
||
|
return Err(NarrowError::Overflow);
|
||
|
}
|
||
|
Ok(self as i8)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn test_i16_i8(){
|
||
|
assert!(matches!(257i16.try_narrow(),Err(NarrowError::Overflow)));
|
||
|
assert!(matches!(64i16.try_narrow(),Ok(64i8)));
|
||
|
assert!(matches!((-257i16).try_narrow(),Err(NarrowError::Underflow)));
|
||
|
}
|
||
|
}
|