diff --git a/crates/nu-command/src/core_commands/echo.rs b/crates/nu-command/src/core_commands/echo.rs new file mode 100644 index 0000000000..af0c994893 --- /dev/null +++ b/crates/nu-command/src/core_commands/echo.rs @@ -0,0 +1,66 @@ +use nu_engine::CallExt; +use nu_protocol::ast::Call; +use nu_protocol::engine::{Command, EngineState, Stack}; +use nu_protocol::{ + Example, PipelineData, ShellError, Signature, Span, SyntaxShape, Value, ValueStream, +}; + +#[derive(Clone)] +pub struct Echo; + +impl Command for Echo { + fn name(&self) -> &str { + "echo" + } + + fn usage(&self) -> &str { + "Echo the arguments back to the user." + } + + fn signature(&self) -> Signature { + Signature::build("echo").rest("rest", SyntaxShape::Any, "the values to echo") + } + + fn run( + &self, + engine_state: &EngineState, + stack: &mut Stack, + call: &Call, + _input: PipelineData, + ) -> Result { + call.rest(engine_state, stack, 0).map(|to_be_echoed| { + PipelineData::Stream(ValueStream::from_stream( + to_be_echoed.into_iter(), + engine_state.ctrlc.clone(), + )) + }) + } + + fn examples(&self) -> Vec { + vec![ + Example { + description: "Put a hello message in the pipeline", + example: "echo 'hello'", + result: Some(Value::List { + vals: vec![Value::test_string("hello")], + span: Span::new(0, 0), + }), + }, + Example { + description: "Print the value of the special '$nu' variable", + example: "echo $nu", + result: None, + }, + ] + } +} + +#[cfg(test)] +mod test { + #[test] + fn test_examples() { + use super::Echo; + use crate::test_examples; + test_examples(Echo {}) + } +} diff --git a/crates/nu-command/src/core_commands/mod.rs b/crates/nu-command/src/core_commands/mod.rs index a124ffcf18..78e3604969 100644 --- a/crates/nu-command/src/core_commands/mod.rs +++ b/crates/nu-command/src/core_commands/mod.rs @@ -1,6 +1,7 @@ mod alias; mod def; mod do_; +mod echo; mod export_def; mod for_; mod help; @@ -14,6 +15,7 @@ mod use_; pub use alias::Alias; pub use def::Def; pub use do_::Do; +pub use echo::Echo; pub use export_def::ExportDef; pub use for_::For; pub use help::Help; diff --git a/crates/nu-command/src/default_context.rs b/crates/nu-command/src/default_context.rs index cab72fac8d..c1c54243de 100644 --- a/crates/nu-command/src/default_context.rs +++ b/crates/nu-command/src/default_context.rs @@ -30,6 +30,7 @@ pub fn create_default_context() -> EngineState { Def, Do, Each, + Echo, ExportDef, External, For,