jmespath_community/functions/builtin/
reverse.rs1use 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 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}