Skip to main content

rl_lang/interpreter/stdlib/array/
arr_slice.rs

1use crate::{
2    interpreter::{evaluator::Evaluator, values::Value},
3    utils::{errors::Error, span::Span},
4};
5
6pub fn std_arr_slice(
7    eval: &mut Evaluator,
8    array: Value,
9    start: i64,
10    end: i64,
11    span: Span,
12) -> Result<Value, Error> {
13    match array {
14        Value::Values { items_type, items } => {
15            let start = start as usize;
16            let end = end as usize;
17            if start > items.len() || end > items.len() {
18                return Err(eval.err(
19                    format!(
20                        "slice index out of bounds: {}..{} (len {})",
21                        start,
22                        end,
23                        items.len()
24                    ),
25                    span,
26                ));
27            }
28            if start > end {
29                return Err(eval.err(
30                    format!("slice start {} is greater than end {}", start, end),
31                    span,
32                ));
33            }
34            Ok(Value::Values {
35                items_type,
36                items: items[start..end].to_vec(),
37            })
38        }
39        _ => Err(eval.err("arr_slice() accepts only arrays".to_string(), span)),
40    }
41}