From 4cdaed1ad4cdc6d91933e504e6e1f02c6ffce2ac Mon Sep 17 00:00:00 2001 From: Jonathan Turner Date: Sun, 8 Sep 2019 11:43:53 +1200 Subject: [PATCH] Add echo command --- src/cli.rs | 1 + src/commands.rs | 2 ++ src/commands/echo.rs | 72 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 src/commands/echo.rs diff --git a/src/cli.rs b/src/cli.rs index 706b76702..cfd9d8de6 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -210,6 +210,7 @@ pub async fn cli() -> Result<(), Box> { per_item_command(Open), per_item_command(Post), per_item_command(Where), + per_item_command(Echo), whole_stream_command(Config), whole_stream_command(SkipWhile), per_item_command(Enter), diff --git a/src/commands.rs b/src/commands.rs index e0e1c80e5..f2885f369 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -11,6 +11,7 @@ pub(crate) mod config; pub(crate) mod cp; pub(crate) mod date; pub(crate) mod debug; +pub(crate) mod echo; pub(crate) mod enter; pub(crate) mod exit; pub(crate) mod fetch; @@ -76,6 +77,7 @@ pub(crate) use config::Config; pub(crate) use cp::Cpy; pub(crate) use date::Date; pub(crate) use debug::Debug; +pub(crate) use echo::Echo; pub(crate) use enter::Enter; pub(crate) use exit::Exit; pub(crate) use fetch::Fetch; diff --git a/src/commands/echo.rs b/src/commands/echo.rs new file mode 100644 index 000000000..f464630de --- /dev/null +++ b/src/commands/echo.rs @@ -0,0 +1,72 @@ +use crate::data::Value; +use crate::errors::ShellError; +use crate::prelude::*; + +use crate::parser::registry::Signature; + +pub struct Echo; + +impl PerItemCommand for Echo { + fn name(&self) -> &str { + "echo" + } + + fn signature(&self) -> Signature { + Signature::build("echo").rest(SyntaxType::Any) + } + + fn usage(&self) -> &str { + "Echo the argments back to the user." + } + + fn run( + &self, + call_info: &CallInfo, + registry: &CommandRegistry, + raw_args: &RawCommandArgs, + _input: Tagged, + ) -> Result { + run(call_info, registry, raw_args) + } +} + +fn run( + call_info: &CallInfo, + _registry: &CommandRegistry, + _raw_args: &RawCommandArgs, +) -> Result { + let name = call_info.name_span; + + let mut output = String::new(); + + let mut first = true; + + if let Some(ref positional) = call_info.args.positional { + for i in positional { + match i.as_string() { + Ok(s) => { + if !first { + output.push_str(" "); + } else { + first = false; + } + + output.push_str(&s); + } + _ => { + return Err(ShellError::labeled_error( + "Expect a string from pipeline", + "not a string-compatible value", + i.span(), + )); + } + } + } + } + + let stream = VecDeque::from(vec![Ok(ReturnSuccess::Value( + Value::string(output).simple_spanned(name), + ))]); + + Ok(stream.to_output_stream()) +}