nu_command/filters/
shuffle.rs

1use nu_engine::command_prelude::*;
2use rand::{prelude::SliceRandom, rng};
3
4#[derive(Clone)]
5pub struct Shuffle;
6
7impl Command for Shuffle {
8    fn name(&self) -> &str {
9        "shuffle"
10    }
11
12    fn signature(&self) -> nu_protocol::Signature {
13        Signature::build("shuffle")
14            .input_output_types(vec![(
15                Type::List(Box::new(Type::Any)),
16                Type::List(Box::new(Type::Any)),
17            )])
18            .category(Category::Filters)
19    }
20
21    fn description(&self) -> &str {
22        "Shuffle rows randomly."
23    }
24
25    fn run(
26        &self,
27        engine_state: &EngineState,
28        _stack: &mut Stack,
29        call: &Call,
30        input: PipelineData,
31    ) -> Result<PipelineData, ShellError> {
32        let metadata = input.metadata();
33        let mut values = input.into_iter_strict(call.head)?.collect::<Vec<_>>();
34        values.shuffle(&mut rng());
35        let iter = values.into_iter();
36        Ok(iter.into_pipeline_data_with_metadata(
37            call.head,
38            engine_state.signals().clone(),
39            metadata,
40        ))
41    }
42
43    fn examples(&self) -> Vec<Example<'_>> {
44        vec![Example {
45            description: "Shuffle rows randomly (execute it several times and see the difference)",
46            example: r#"[[version patch]; ['1.0.0' false] ['3.0.1' true] ['2.0.0' false]] | shuffle"#,
47            result: None,
48        }]
49    }
50}