1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
pub fn safe_add<T>(in_x: T, in_y: T) -> Result<i64, T> where i128: From<T>, T: Clone + Copy {    
    let x: i128 = i128::from(in_x);
    let y: i128 = i128::from(in_y);
    let returned_value = match x > y {
        true => in_x,
        false => in_y
    };

    let sum: i128 = x + y;
    let result = i64::try_from(sum);
    match result {
        Ok(v) => return Ok(v),
        Err(_) => return Err(returned_value)
    };
}

pub fn safe_multiply<T>(in_x: T, in_y: T) -> Result<i64, T> where i128: From<T>, T: Clone + Copy {
    let x: i128 = i128::from(in_x);
    let y: i128 = i128::from(in_y);
    let returned_value = match x > y {
        true => in_x,
        false => in_y
    };

    let product: i128 = x*y;
    let result = i64::try_from(product);
    match result {
        Ok(v) => return Ok(v),
        Err(_) => return Err(returned_value)
    };
}