use crate::public::failures::ErrorCases;
use num::traits::ops::checked::{
CheckedAdd, CheckedDiv, CheckedMul, CheckedNeg, CheckedRem, CheckedSub,
};
use super::{failures::ErrorCases::Overflow, traits::CheckedCalc};
pub enum Operator {
Add,
Sub,
Mul,
Div,
Neg,
Rem,
}
pub fn safe_calc<T: CheckedCalc>(a: &T, b: &T, op: &Operator) -> Result<T, ErrorCases> {
match *op {
Operator::Add => CheckedAdd::checked_add(a, b).ok_or(Overflow),
Operator::Sub => CheckedSub::checked_sub(a, b).ok_or(Overflow),
Operator::Mul => CheckedMul::checked_mul(a, b).ok_or(Overflow),
Operator::Div => CheckedDiv::checked_div(a, b).ok_or(Overflow),
Operator::Rem => CheckedRem::checked_rem(a, b).ok_or(Overflow),
Operator::Neg => CheckedNeg::checked_neg(a).ok_or(Overflow),
}
}