Skip to main content

rl_lang/interpreter/stdlib/types/
int.rs

1use crate::interpreter::{
2    evaluator::Evaluator,
3    stdlib::common::{verr, vi, vok, vs},
4    values::Value,
5};
6
7pub fn std_is_int(_: &mut Evaluator, value: Value) -> bool {
8    matches!(value, Value::Integer(_))
9}
10
11pub fn std_to_int(_: &mut Evaluator, value: Value) -> Value {
12    let result = match value {
13        Value::Integer(v) => v,
14        Value::Byte(v) => v as i64,
15        Value::Float(v) => v as i64,
16        Value::Bool(v) => {
17            if v {
18                1
19            } else {
20                0
21            }
22        }
23        Value::Char(v) => v as i64,
24        Value::String(s) => {
25            let s = s.trim();
26            if s.starts_with("0x") || s.starts_with("0X") {
27                match i64::from_str_radix(&s[2..], 16) {
28                    Ok(i) => i,
29                    Err(_) => return verr!(vs!(format!("cannot parse \"{}\" as int", s))),
30                }
31            } else {
32                match s.parse::<i64>() {
33                    Ok(i) => i,
34                    Err(_) => return verr!(vs!(format!("cannot parse \"{}\" as int", s))),
35                }
36            }
37        }
38
39        other => {
40            return verr!(vs!(format!(
41                "cannot parse \"{}\" as int",
42                other.type_name()
43            )));
44        }
45    };
46    vok!(vi!(result))
47}