rl_lang/interpreter/stdlib/array/
arr_slice.rs1use 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}