diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index 867c119..4d2b0bd 100644 --- a/src/cmd/mod.rs +++ b/src/cmd/mod.rs @@ -7,6 +7,7 @@ pub mod ls; pub mod mkdir; pub mod mv; pub mod open; +pub mod print; pub mod pwd; pub mod random; pub mod rm; @@ -23,6 +24,7 @@ pub use ls::Ls; pub use mkdir::Mkdir; pub use mv::Mv; pub use open::Open; +pub use print::Print; pub use pwd::Pwd; pub use random::Random; pub use rm::Rm; diff --git a/src/cmd/print.rs b/src/cmd/print.rs new file mode 100644 index 0000000..13859c6 --- /dev/null +++ b/src/cmd/print.rs @@ -0,0 +1,47 @@ +use crate::globals::print_to_console; +use nu_engine::CallExt; +use nu_protocol::{ + Category, PipelineData, ShellError, Signature, SyntaxShape, Type, Value, + engine::{Command, EngineState, Stack}, +}; + +#[derive(Clone)] +pub struct Print; + +impl Command for Print { + fn name(&self) -> &str { + "print" + } + + fn signature(&self) -> Signature { + Signature::build("print") + .rest("rest", SyntaxShape::Any, "values to print") + .input_output_type(Type::Nothing, Type::Nothing) + .category(Category::Strings) + } + + fn description(&self) -> &str { + "print values to the console." + } + + fn run( + &self, + engine_state: &EngineState, + stack: &mut Stack, + call: &nu_protocol::engine::Call, + _input: PipelineData, + ) -> Result { + let rest: Vec = call.rest(engine_state, stack, 0)?; + + let mut parts = Vec::new(); + for value in rest { + let s = value.to_expanded_string(" ", &engine_state.config); + parts.push(s); + } + let output = parts.join(" "); + print_to_console(&output, true)?; + + Ok(PipelineData::Empty) + } +} + diff --git a/src/lib.rs b/src/lib.rs index d9eff88..a869e03 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,7 +28,7 @@ pub mod memory_fs; use crate::{ cmd::{ - Cd, Fetch, Job, JobKill, JobList, Ls, Mkdir, Mv, Open, Pwd, Random, Rm, Save, Source, Sys, + Cd, Fetch, Job, JobKill, JobList, Ls, Mkdir, Mv, Open, Print, Pwd, Random, Rm, Save, Source, Sys, source::eval_file, }, default_context::add_shell_command_context, @@ -102,7 +102,7 @@ fn init_engine_internal() -> Result<(), Report> { engine_state = add_extra_command_context(engine_state); let mut working_set = StateWorkingSet::new(&engine_state); - let decls: [Box; 15] = [ + let decls: [Box; 16] = [ Box::new(Ls), Box::new(Open), Box::new(Save), @@ -118,6 +118,7 @@ fn init_engine_internal() -> Result<(), Report> { Box::new(JobKill), Box::new(Sys), Box::new(Random), + Box::new(Print), ]; for decl in decls { working_set.add_decl(decl);