From abb6fca5e3ac5e32919de8b856583846b8426bf1 Mon Sep 17 00:00:00 2001 From: Darren Schroeder <343840+fdncred@users.noreply.github.com> Date: Wed, 23 Oct 2024 16:49:51 -0500 Subject: [PATCH] make adding newlines with `to text` more consistent and opt-out-able (#14158) # Description This PR tries to make `to text` more consistent with how it adds newlines and also gives you an opt-out --no-newline option. ![image](https://github.com/user-attachments/assets/e4976ce6-c685-47a4-8470-4947970daf47) I wasn't sure how to change the `PipelineData::ByteStream` match arm. I figure something needs to be done there but I'm not sure how to do it. # User-Facing Changes newlines are more consistent. # Tests + Formatting # After Submitting --- crates/nu-command/src/formats/to/text.rs | 26 ++++++++++++++++++++---- crates/nu-command/tests/commands/save.rs | 2 +- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/crates/nu-command/src/formats/to/text.rs b/crates/nu-command/src/formats/to/text.rs index b1c1fdb1ba..3b365d6649 100644 --- a/crates/nu-command/src/formats/to/text.rs +++ b/crates/nu-command/src/formats/to/text.rs @@ -21,6 +21,11 @@ impl Command for ToText { fn signature(&self) -> Signature { Signature::build("to text") .input_output_types(vec![(Type::Any, Type::String)]) + .switch( + "no-newline", + "Do not append a newline to the end of the text", + Some('n'), + ) .category(Category::Formats) } @@ -36,6 +41,7 @@ impl Command for ToText { input: PipelineData, ) -> Result { let span = call.head; + let no_newline = call.has_flag(engine_state, stack, "no-newline")?; let input = input.try_expand_range()?; let config = stack.get_config(engine_state); @@ -43,7 +49,12 @@ impl Command for ToText { PipelineData::Empty => Ok(Value::string(String::new(), span) .into_pipeline_data_with_metadata(update_metadata(None))), PipelineData::Value(value, ..) => { - let str = local_into_string(value, LINE_ENDING, &config); + let is_compound_type = matches!(value, Value::List { .. } | Value::Record { .. }); + let mut str = local_into_string(value, LINE_ENDING, &config); + if is_compound_type && !no_newline { + str.push_str(LINE_ENDING); + } + Ok( Value::string(str, span) .into_pipeline_data_with_metadata(update_metadata(None)), @@ -53,7 +64,9 @@ impl Command for ToText { let span = stream.span(); let iter = stream.into_inner().map(move |value| { let mut str = local_into_string(value, LINE_ENDING, &config); - str.push_str(LINE_ENDING); + if !no_newline { + str.push_str(LINE_ENDING); + } str }); Ok(PipelineData::ByteStream( @@ -75,8 +88,13 @@ impl Command for ToText { fn examples(&self) -> Vec { vec![ Example { - description: "Outputs data as simple text", - example: "1 | to text", + description: "Outputs data as simple text with a newline", + example: "[1] | to text", + result: Some(Value::test_string("1".to_string() + LINE_ENDING)), + }, + Example { + description: "Outputs data as simple text without a newline", + example: "[1] | to text --no-newline", result: Some(Value::test_string("1")), }, Example { diff --git a/crates/nu-command/tests/commands/save.rs b/crates/nu-command/tests/commands/save.rs index 85076099bf..6b77160bee 100644 --- a/crates/nu-command/tests/commands/save.rs +++ b/crates/nu-command/tests/commands/save.rs @@ -415,7 +415,7 @@ fn save_with_custom_converter() { nu!(cwd: dirs.test(), pipeline( r#" - def "to ndjson" []: any -> string { each { to json --raw } | to text } ; + def "to ndjson" []: any -> string { each { to json --raw } | to text --no-newline } ; {a: 1, b: 2} | save test.ndjson "# ));