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
32
33
34
35
36
37
38
39
40
use crate::native::get_type_string;
use crate::value::Value;

/// Convert arg to a float and do some error checks (without casting)
pub fn to_float(arg: &Value) -> Result<f32, String> {
    match arg.as_float() {
        Some(num) => {
            if num.is_nan() {
                return Err("Invalid argument: expected number, got NaN".to_string());
            }
            Ok(num)
        }
        None => Err(format!(
            "Invalid argument: expected number: instead got {}",
            get_type_string(arg)
        )),
    }
}

/// Convert arg to a long and do some error checks (without casting)
pub fn to_long(arg: &Value) -> Result<i64, String> {
    match arg.as_long() {
        Some(num) => Ok(num),
        None => Err(format!(
            "Invalid argument: expected number: instead got {}",
            get_type_string(arg)
        )),
    }
}

/// Convert arg to a bool and do some error checks (without casting)
pub fn to_bool(arg: &Value) -> Result<bool, String> {
    match arg.as_bool() {
        Some(val) => Ok(val),
        None => Err(format!(
            "Invalid argument: expected boolean: instead got {}",
            get_type_string(arg)
        )),
    }
}