rl_lang/interpreter/stdlib/bitwise/
bit_shift_left.rs1use 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}