Skip to main content

rl_lang/interpreter/stdlib/bitwise/
trailing_zeros.rs

1use crate::{
2    interpreter::{evaluator::Evaluator, values::Value},
3    utils::{errors::Error, span::Span},
4};
5
6pub fn std_trailing_zeros(
7    eval: &mut Evaluator,
8    args: Vec<Value>,
9    span: Span,
10) -> Result<Value, Error> {
11    if args.len() != 1 {
12        return Err(eval.err(
13            format!("trailing_zeros() expects 1 argument, got {}", args.len()),
14            span,
15        ));
16    }
17
18    match args.into_iter().next().unwrap_or(Value::Null) {
19        Value::Byte(x) => Ok(Value::Byte(u8::trailing_zeros(x) as u8)),
20        Value::Integer(x) => Ok(Value::Integer(i64::trailing_zeros(x) as i64)),
21        _ => Err(eval.err(
22            "trailing_zeros() expects a byte or an int".to_string(),
23            span,
24        )),
25    }
26}