jmespath_community/functions/builtin/
reverse.rs

1use crate::function;
2
3use crate::functions::ReturnValue;
4use crate::FunctionContext;
5use crate::Value;
6
7use crate::functions::DataType;
8use crate::functions::Function;
9use crate::functions::ParamTypes::*;
10use crate::functions::Parameter::{self, *};
11
12function!(reverse, [ subject => Required(Any(vec![DataType::Array, DataType::String])) ], |_: &reverse, args: &Vec<Value>, _: &dyn FunctionContext| {
13    let reversed = match &args[0] {
14        Value::Array(v) => {
15            let mut vec = v.clone();
16            vec.reverse();
17            Value::Array(vec)
18        },
19        Value::String(s) => {
20            let mut vec: Vec<char> = s.chars().collect();
21            vec.reverse();
22            let s: String = vec.into_iter().collect();
23            Value::String(s)
24        },
25        _ => unreachable!(),
26    };
27    Ok(reversed)
28});
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33    use crate::errors::Error as RuntimeError;
34    use crate::Runtime;
35    use rstest::*;
36
37    struct Fixture {
38        runtime: Runtime,
39    }
40    impl FunctionContext for Fixture {
41        fn create_by_function<'a>(
42            &'a self,
43            _ast: &'a crate::AST,
44            _params: &'a Vec<crate::functions::ParamTypes>,
45            _function: &'a dyn Function,
46            _param_index: usize,
47        ) -> Result<crate::ByFunctionHolder<'a>, RuntimeError> {
48            todo!()
49        }
50    }
51
52    fn setup() -> Fixture {
53        let runtime = Runtime::create_runtime();
54        Fixture { runtime }
55    }
56
57    #[rstest]
58    #[case("oof".into(), "foo".into())]
59    #[case(vec!["baz", "bar", "foo"].into(), vec!["foo", "bar", "baz"].into())]
60    fn revserse(#[case] expected: Value, #[case] input: Value) {
61        let fixture = setup();
62        let context: &dyn FunctionContext = &fixture;
63
64        // call function
65
66        let fname = "reverse";
67        let args = vec![input];
68        let result = fixture.runtime.call(fname, &args, context).unwrap();
69
70        assert_eq!(expected, result);
71    }
72}