rl_lang/interpreter/stdlib/types/
int.rs1use 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}