nu_command/filters/
reverse.rs

1use nu_engine::command_prelude::*;
2
3#[derive(Clone)]
4pub struct Reverse;
5
6impl Command for Reverse {
7    fn name(&self) -> &str {
8        "reverse"
9    }
10
11    fn signature(&self) -> nu_protocol::Signature {
12        Signature::build("reverse")
13            .input_output_types(vec![(
14                Type::List(Box::new(Type::Any)),
15                Type::List(Box::new(Type::Any)),
16            )])
17            .category(Category::Filters)
18    }
19
20    fn description(&self) -> &str {
21        "Reverses the input list or table."
22    }
23
24    fn search_terms(&self) -> Vec<&str> {
25        vec!["convert, inverse, flip"]
26    }
27
28    fn examples(&self) -> Vec<Example> {
29        vec![
30            Example {
31                example: "[0,1,2,3] | reverse",
32                description: "Reverse a list",
33                result: Some(Value::test_list(vec![
34                    Value::test_int(3),
35                    Value::test_int(2),
36                    Value::test_int(1),
37                    Value::test_int(0),
38                ])),
39            },
40            Example {
41                example: "[{a: 1} {a: 2}] | reverse",
42                description: "Reverse a table",
43                result: Some(Value::test_list(vec![
44                    Value::test_record(record! {
45                        "a" => Value::test_int(2),
46                    }),
47                    Value::test_record(record! {
48                        "a" => Value::test_int(1),
49                    }),
50                ])),
51            },
52        ]
53    }
54
55    fn run(
56        &self,
57        engine_state: &EngineState,
58        _stack: &mut Stack,
59        call: &Call,
60        input: PipelineData,
61    ) -> Result<PipelineData, ShellError> {
62        let head = call.head;
63        let metadata = input.metadata();
64        let values = input.into_iter_strict(head)?.collect::<Vec<_>>();
65        let iter = values.into_iter().rev();
66        Ok(iter.into_pipeline_data_with_metadata(head, engine_state.signals().clone(), metadata))
67    }
68}
69
70#[cfg(test)]
71mod test {
72    use super::*;
73
74    #[test]
75    fn test_examples() {
76        use crate::test_examples;
77
78        test_examples(Reverse {})
79    }
80}