roan_engine/value/methods/
vec.rs

1use crate::{
2    as_cast, native_function,
3    value::Value,
4    vm::native_fn::{NativeFunction, NativeFunctionParam},
5};
6
7native_function!(
8    fn __vec_len(vec) {
9        let vec = as_cast!(vec, Vec);
10
11        Value::Int(vec.len() as i64)
12    }
13);
14
15native_function!(
16    fn __vec_next(vec) {
17        let mut vec = as_cast!(vec, Vec);
18
19        Value::Vec(vec.into_iter().skip(1).collect())
20    }
21);
22
23native_function!(
24    fn __vec_push(vec, value) {
25        let mut vec = as_cast!(vec, Vec);
26        let value = value;
27
28        vec.push(value);
29
30        Value::Vec(vec)
31    }
32);
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37    use crate::value::Value;
38
39    #[test]
40    fn test_vec_len() {
41        let vec = vec![Value::Int(1), Value::Int(2), Value::Int(3)];
42        let result = __vec_len().call(vec![Value::Vec(vec.clone())]).unwrap();
43
44        assert_eq!(result, Value::Int(3));
45    }
46
47    #[test]
48    fn test_vec_next() {
49        let vec = vec![Value::Int(1), Value::Int(2), Value::Int(3)];
50        let result = __vec_next().call(vec![Value::Vec(vec.clone())]).unwrap();
51
52        assert_eq!(result, Value::Vec(vec![Value::Int(2), Value::Int(3)]));
53    }
54
55    #[test]
56    fn test_vec_push() {
57        let vec = vec![Value::Int(1), Value::Int(2), Value::Int(3)];
58        let result = __vec_push()
59            .call(vec![Value::Vec(vec.clone()), Value::Int(4)])
60            .unwrap();
61
62        assert_eq!(
63            result,
64            Value::Vec(vec![
65                Value::Int(1),
66                Value::Int(2),
67                Value::Int(3),
68                Value::Int(4)
69            ])
70        );
71    }
72}