Skip to main content

rl_lang/interpreter/stdlib/bitwise/
bit_or.rs

1use crate::{
2    interpreter::{evaluator::Evaluator, values::Value},
3    utils::{errors::Error, span::Span},
4};
5
6pub fn std_bit_or(eval: &mut Evaluator, args: Vec<Value>, span: Span) -> Result<Value, Error> {
7    if args.len() != 2 {
8        return Err(eval.err(
9            format!("bit_or() expects 2 arguments, got {}", args.len()),
10            span,
11        ));
12    }
13
14    let mut iter = args.into_iter();
15    let a = iter.next().unwrap_or(Value::Null);
16    let b = iter.next().unwrap_or(Value::Null);
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_or() expects byte or integer arguments".to_string(),
25            span,
26        )),
27    }
28}