Skip to main content

rl_lang/interpreter/stdlib/bitwise/
bit_shift_left.rs

1use crate::{
2    interpreter::{evaluator::Evaluator, values::Value},
3    utils::{errors::Error, span::Span},
4};
5
6pub fn std_bit_shift_left(
7    eval: &mut Evaluator,
8    args: Vec<Value>,
9    span: Span,
10) -> Result<Value, Error> {
11    if args.len() != 2 {
12        return Err(eval.err(
13            format!("bit_shift_left() expects 2 arguments, got {}", args.len()),
14            span,
15        ));
16    }
17
18    let mut iter = args.into_iter();
19    let a = iter.next().unwrap_or(Value::Null);
20    let shift = iter.next().unwrap_or(Value::Null);
21
22    match (a, shift) {
23        (Value::Byte(x), Value::Byte(s)) => Ok(Value::Byte(x << (s as u32))),
24        (Value::Byte(x), Value::Integer(s)) => Ok(Value::Byte(x << (s as u32))),
25        (Value::Integer(x), Value::Byte(s)) => Ok(Value::Integer(x << (s as u32))),
26        (Value::Integer(x), Value::Integer(s)) => Ok(Value::Integer(x << (s as u32))),
27        _ => Err(eval.err(
28            "bit_shift_left() expects ((byte|int), (int|byte))".to_string(),
29            span,
30        )),
31    }
32}