Skip to main content

rl_lang/interpreter/stdlib/types/
byte.rs

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