rl_lang/interpreter/stdlib/bitwise/
bit_and.rs1use crate::{
2 interpreter::{evaluator::Evaluator, values::Value},
3 utils::{errors::Error, span::Span},
4};
5
6pub fn std_bit_and(eval: &mut Evaluator, args: Vec<Value>, span: Span) -> Result<Value, Error> {
7 if args.len() != 2 {
8 return Err(eval.err(
9 format!("bit_and() expects 2 arguments, got {}", args.len()),
10 span,
11 ));
12 }
13
14 let mut iter = args.into_iter();
15 let a = iter.next().unwrap();
16 let b = iter.next().unwrap();
17
18 match (a, b) {
19 (Value::Byte(x), Value::Byte(y)) => Ok(Value::Byte(x & y)),
20 (Value::Integer(x), Value::Integer(y)) => Ok(Value::Integer(x & y)),
21 (Value::Byte(x), Value::Integer(y)) => Ok(Value::Integer(x as i64 & y)),
22 (Value::Integer(x), Value::Byte(y)) => Ok(Value::Integer(x & y as i64)),
23 _ => Err(eval.err(
24 "bit_and() expects byte or integer arguments".to_string(),
25 span,
26 )),
27 }
28}