From 88ff622b16d7fed8845c409f383034545394b9bd Mon Sep 17 00:00:00 2001 From: pwygab <88221256+merelymyself@users.noreply.github.com> Date: Sat, 6 Apr 2024 09:28:15 +0800 Subject: [PATCH] Make `view source` more robust (#12359) # Description Resolves #11800. ``` ~/CodingProjects/nushell> def "url expand" [$urls:any = []]: [string -> string, list -> table] { ::: let urls = ($in | default $urls) ::: def expand-link [] { ::: http head --redirect-mode manual $in | where name == location | get value.0 ::: } ::: match ($urls | describe) { ::: string => { $urls | expand-link } ::: $type if ($type =~ list) => { $urls | wrap link | insert expanded {|url| $url.link | expand-link}} ::: } ::: }; view source "url expand" def "url expand" [ $urls: any = [] ]: [string -> string, list -> table] { let urls = ($in | default $urls) def expand-link [] { http head --redirect-mode manual $in | where name == location | get value.0 } match ($urls | describe) { string => { $urls | expand-link } $type if ($type =~ list) => { $urls | wrap link | insert expanded {|url| $url.link | expand-link}} } } ``` # User-Facing Changes `view source` now - adds quotes to commands with spaces - shows default argument values - shows type signatures # Tests + Formatting # After Submitting --- crates/nu-command/src/debug/view_source.rs | 44 ++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/crates/nu-command/src/debug/view_source.rs b/crates/nu-command/src/debug/view_source.rs index d4ab355e6c..8e8e3bbe2c 100644 --- a/crates/nu-command/src/debug/view_source.rs +++ b/crates/nu-command/src/debug/view_source.rs @@ -1,4 +1,5 @@ use nu_engine::command_prelude::*; +use nu_protocol::Config; use std::fmt::Write; @@ -41,6 +42,7 @@ impl Command for ViewSource { let vec_of_optional = &sig.optional_positional; let rest = &sig.rest_positional; let vec_of_flags = &sig.named; + let type_signatures = &sig.input_output_types; if decl.is_alias() { if let Some(alias) = &decl.as_alias() { @@ -58,13 +60,36 @@ impl Command for ViewSource { if let Some(block_span) = block.span { let contents = engine_state.get_span_contents(block_span); // name of function - let mut final_contents = format!("def {val} [ "); + let mut final_contents = String::new(); + if val.contains(' ') { + let _ = write!(&mut final_contents, "def \"{val}\" ["); + } else { + let _ = write!(&mut final_contents, "def {val} ["); + }; + if !vec_of_required.is_empty() + || !vec_of_optional.is_empty() + || vec_of_flags.len() != 1 + || rest.is_some() + { + final_contents.push(' '); + } for n in vec_of_required { let _ = write!(&mut final_contents, "{}: {} ", n.name, n.shape); - // positional argu,emts + // positional arguments } for n in vec_of_optional { - let _ = write!(&mut final_contents, "{}?: {} ", n.name, n.shape); + if let Some(s) = n.default_value.clone() { + let _ = write!( + &mut final_contents, + "{}: {} = {} ", + n.name, + n.shape, + s.to_expanded_string(" ", &Config::default()) + ); + } else { + let _ = + write!(&mut final_contents, "{}?: {} ", n.name, n.shape); + } } for n in vec_of_flags { // skip adding the help flag @@ -87,6 +112,19 @@ impl Command for ViewSource { rest_arg.name, rest_arg.shape ); } + let len = type_signatures.len(); + if len != 0 { + final_contents.push_str("]: ["); + let mut c = 0; + for (insig, outsig) in type_signatures { + c += 1; + let s = format!("{} -> {}", insig, outsig); + final_contents.push_str(&s); + if c != len { + final_contents.push_str(", ") + } + } + } final_contents.push_str("] "); final_contents.push_str(&String::from_utf8_lossy(contents)); Ok(Value::string(final_contents, call.head).into_pipeline_data())