diff --git a/crates/nu-command/src/core_commands/debug.rs b/crates/nu-command/src/core_commands/debug.rs new file mode 100644 index 0000000000..78a52e6752 --- /dev/null +++ b/crates/nu-command/src/core_commands/debug.rs @@ -0,0 +1,57 @@ +use nu_protocol::ast::Call; +use nu_protocol::engine::{Command, EngineState, Stack}; +use nu_protocol::{Category, Example, PipelineData, ShellError, Signature, Value}; + +#[derive(Clone)] +pub struct Debug; + +impl Command for Debug { + fn name(&self) -> &str { + "debug" + } + + fn usage(&self) -> &str { + "Debug print the value(s) piped in." + } + + fn signature(&self) -> Signature { + Signature::build("describe").category(Category::Core) + } + + fn run( + &self, + engine_state: &EngineState, + stack: &mut Stack, + call: &Call, + input: PipelineData, + ) -> Result { + let head = call.head; + let config = stack.get_config()?; + + input.map( + move |x| Value::String { + val: x.debug_string(", ", &config), + span: head, + }, + engine_state.ctrlc.clone(), + ) + } + + fn examples(&self) -> Vec { + vec![Example { + description: "Describe the type of a string", + example: "'hello' | debug", + result: Some(Value::test_string("hello")), + }] + } +} + +#[cfg(test)] +mod test { + #[test] + fn test_examples() { + use super::Debug; + use crate::test_examples; + test_examples(Debug {}) + } +} diff --git a/crates/nu-command/src/core_commands/describe.rs b/crates/nu-command/src/core_commands/describe.rs new file mode 100644 index 0000000000..b5a988b0c0 --- /dev/null +++ b/crates/nu-command/src/core_commands/describe.rs @@ -0,0 +1,55 @@ +use nu_protocol::ast::Call; +use nu_protocol::engine::{Command, EngineState, Stack}; +use nu_protocol::{Category, Example, PipelineData, ShellError, Signature, Value}; + +#[derive(Clone)] +pub struct Describe; + +impl Command for Describe { + fn name(&self) -> &str { + "describe" + } + + fn usage(&self) -> &str { + "Describe the value(s) piped in." + } + + fn signature(&self) -> Signature { + Signature::build("describe").category(Category::Core) + } + + fn run( + &self, + engine_state: &EngineState, + _stack: &mut Stack, + call: &Call, + input: PipelineData, + ) -> Result { + let head = call.head; + input.map( + move |x| Value::String { + val: x.get_type().to_string(), + span: head, + }, + engine_state.ctrlc.clone(), + ) + } + + fn examples(&self) -> Vec { + vec![Example { + description: "Describe the type of a string", + example: "'hello' | describe", + result: Some(Value::test_string("string")), + }] + } +} + +#[cfg(test)] +mod test { + #[test] + fn test_examples() { + use super::Describe; + use crate::test_examples; + test_examples(Describe {}) + } +} diff --git a/crates/nu-command/src/core_commands/mod.rs b/crates/nu-command/src/core_commands/mod.rs index 745395956c..28f1700024 100644 --- a/crates/nu-command/src/core_commands/mod.rs +++ b/crates/nu-command/src/core_commands/mod.rs @@ -1,5 +1,7 @@ mod alias; +mod debug; mod def; +mod describe; mod do_; mod echo; mod export; @@ -15,7 +17,9 @@ mod source; mod use_; pub use alias::Alias; +pub use debug::Debug; pub use def::Def; +pub use describe::Describe; pub use do_::Do; pub use echo::Echo; pub use export::ExportCommand; diff --git a/crates/nu-command/src/default_context.rs b/crates/nu-command/src/default_context.rs index 38f15bac65..c7ba22451c 100644 --- a/crates/nu-command/src/default_context.rs +++ b/crates/nu-command/src/default_context.rs @@ -36,7 +36,9 @@ pub fn create_default_context() -> EngineState { DateNow, DateToTable, DateToTimezone, + Debug, Def, + Describe, Do, Each, Echo, diff --git a/crates/nu-protocol/src/engine/engine_state.rs b/crates/nu-protocol/src/engine/engine_state.rs index 67128316c6..176033b86f 100644 --- a/crates/nu-protocol/src/engine/engine_state.rs +++ b/crates/nu-protocol/src/engine/engine_state.rs @@ -1120,7 +1120,7 @@ mod engine_state_tests { } #[test] - fn merge_states() { + fn merge_states() -> Result<(), ShellError> { let mut engine_state = EngineState::new(); engine_state.add_file("test.nu".into(), vec![]); @@ -1130,10 +1130,12 @@ mod engine_state_tests { working_set.render() }; - engine_state.merge_delta(delta); + engine_state.merge_delta(delta)?; assert_eq!(engine_state.num_files(), 2); assert_eq!(&engine_state.files[0].0, "test.nu"); assert_eq!(&engine_state.files[1].0, "child.nu"); + + Ok(()) } }