dsq_functions/builtin/
array_unshift.rs1use dsq_shared::value::Value;
2use dsq_shared::Result;
3use inventory;
4
5pub fn builtin_array_unshift(args: &[Value]) -> Result<Value> {
6 if args.len() < 2 {
7 return Err(dsq_shared::error::operation_error(
8 "array_unshift() expects at least 2 arguments",
9 ));
10 }
11
12 match &args[0] {
13 Value::Array(arr) => {
14 let mut new_arr = args[1..].to_vec();
15 new_arr.extend(arr.clone());
16 Ok(Value::Int(new_arr.len() as i64))
17 }
18 _ => Err(dsq_shared::error::operation_error(
19 "array_unshift() first argument must be an array",
20 )),
21 }
22}
23
24inventory::submit! {
25 crate::FunctionRegistration {
26 name: "array_unshift",
27 func: builtin_array_unshift,
28 }
29}
30
31#[cfg(test)]
32mod tests {
33 use super::*;
34 use dsq_shared::value::Value;
35
36 #[test]
37 fn test_array_unshift_basic() {
38 let args = vec![
39 Value::Array(vec![Value::Int(1), Value::Int(2)]),
40 Value::Int(0),
41 ];
42 let result = builtin_array_unshift(&args);
43 assert!(result.is_ok());
44 assert_eq!(result.unwrap(), Value::Int(3));
45 }
46
47 #[test]
48 fn test_array_unshift_multiple_elements() {
49 let args = vec![
50 Value::Array(vec![Value::Int(3), Value::Int(4)]),
51 Value::Int(1),
52 Value::Int(2),
53 ];
54 let result = builtin_array_unshift(&args);
55 assert!(result.is_ok());
56 assert_eq!(result.unwrap(), Value::Int(4));
57 }
58
59 #[test]
60 fn test_array_unshift_empty_array() {
61 let args = vec![Value::Array(vec![]), Value::Int(1)];
62 let result = builtin_array_unshift(&args);
63 assert!(result.is_ok());
64 assert_eq!(result.unwrap(), Value::Int(1));
65 }
66
67 #[test]
68 fn test_array_unshift_wrong_args_count() {
69 let args = vec![Value::Array(vec![Value::Int(1)])];
70 let result = builtin_array_unshift(&args);
71 assert!(result.is_err());
72 }
73
74 #[test]
75 fn test_array_unshift_invalid_input() {
76 let args = vec![Value::String("not an array".to_string()), Value::Int(1)];
77 let result = builtin_array_unshift(&args);
78 assert!(result.is_err());
79 }
80
81 #[test]
82 fn test_array_unshift_registered_via_inventory() {
83 use crate::BuiltinRegistry;
84 let registry = BuiltinRegistry::new();
85 assert!(registry.functions.contains_key("array_unshift"));
86 }
87}