diff --git a/crates/nu-command/src/default_context.rs b/crates/nu-command/src/default_context.rs index 4adcfe9214..6ef188d571 100644 --- a/crates/nu-command/src/default_context.rs +++ b/crates/nu-command/src/default_context.rs @@ -397,6 +397,7 @@ pub fn add_shell_command_context(mut engine_state: EngineState) -> EngineState { RandomFloat, RandomInt, RandomUuid, + RandomBinary }; // Generators diff --git a/crates/nu-command/src/random/binary.rs b/crates/nu-command/src/random/binary.rs new file mode 100644 index 0000000000..57fd8b01a7 --- /dev/null +++ b/crates/nu-command/src/random/binary.rs @@ -0,0 +1,64 @@ +use nu_engine::command_prelude::*; + +use rand::{thread_rng, RngCore}; + +#[derive(Clone)] +pub struct SubCommand; + +impl Command for SubCommand { + fn name(&self) -> &str { + "random binary" + } + + fn signature(&self) -> Signature { + Signature::build("random binary") + .input_output_types(vec![(Type::Nothing, Type::Binary)]) + .allow_variants_without_examples(true) + .required("length", SyntaxShape::Int, "Length of the output binary.") + .category(Category::Random) + } + + fn usage(&self) -> &str { + "Generate random bytes." + } + + fn search_terms(&self) -> Vec<&str> { + vec!["generate", "bytes"] + } + + fn run( + &self, + engine_state: &EngineState, + stack: &mut Stack, + call: &Call, + _input: PipelineData, + ) -> Result { + let length = call.req(engine_state, stack, 0)?; + let mut rng = thread_rng(); + + let mut out = vec![0u8; length]; + rng.fill_bytes(&mut out); + + Ok(Value::binary(out, call.head).into_pipeline_data()) + } + + fn examples(&self) -> Vec { + vec![Example { + description: "Generate 16 random bytes", + example: "random bytes 16", + result: None, + }] + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_examples() { + use crate::test_examples; + + test_examples(SubCommand {}) + } +} diff --git a/crates/nu-command/src/random/mod.rs b/crates/nu-command/src/random/mod.rs index 5a1fb06cf8..4c05376c88 100644 --- a/crates/nu-command/src/random/mod.rs +++ b/crates/nu-command/src/random/mod.rs @@ -1,3 +1,4 @@ +mod binary; mod bool; mod chars; mod dice; @@ -6,6 +7,7 @@ mod int; mod random_; mod uuid; +pub use self::binary::SubCommand as RandomBinary; pub use self::bool::SubCommand as RandomBool; pub use self::chars::SubCommand as RandomChars; pub use self::dice::SubCommand as RandomDice;