dsq_functions/builtin/
array_unshift.rs

1use 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}