From 36b5d063c13ca3e894eaeddb485bbd7d99f5b0fe Mon Sep 17 00:00:00 2001 From: Jason Gedge Date: Sun, 22 Mar 2020 09:11:39 -0400 Subject: [PATCH] Simplify and improve listing for which. (#1510) * Simplified implementation * Show executables, even if the current user doesn't have permissions to execute them. --- crates/nu-cli/src/commands/which_.rs | 62 +++++----------------------- 1 file changed, 10 insertions(+), 52 deletions(-) diff --git a/crates/nu-cli/src/commands/which_.rs b/crates/nu-cli/src/commands/which_.rs index a14a1c71ed..3a44c6771d 100644 --- a/crates/nu-cli/src/commands/which_.rs +++ b/crates/nu-cli/src/commands/which_.rs @@ -87,66 +87,24 @@ fn which( application.item.clone() }; - if all { - let stream = async_stream! { - if external { - if let Ok(Some(path)) = ichwh::which(&item).await { - yield ReturnSuccess::value(entry_path!(item, path.into(), application.tag.clone())); - } - } - + let stream = async_stream! { + if !external { let builtin = commands.has(&item); if builtin { yield ReturnSuccess::value(entry_builtin!(item, application.tag.clone())); } + } - if let Ok(paths) = ichwh::which_all(&item).await { - if !builtin && paths.len() == 0 { - yield Err(ShellError::labeled_error( - "Binary not found for argument, and argument is not a builtin", - "not found", - &application.tag, - )); - } else { - for path in paths { - yield ReturnSuccess::value(entry_path!(item, path.into(), application.tag.clone())); - } - } - } else { - yield Err(ShellError::labeled_error( - "Error trying to find binary for argument", - "error", - &application.tag, - )); + if let Ok(paths) = ichwh::which_all(&item).await { + for path in paths { + yield ReturnSuccess::value(entry_path!(item, path.into(), application.tag.clone())); } - }; + } + }; + if all { Ok(stream.to_output_stream()) } else { - let stream = async_stream! { - if external { - if let Ok(Some(path)) = ichwh::which(&item).await { - yield ReturnSuccess::value(entry_path!(item, path.into(), application.tag.clone())); - } - } else if commands.has(&item) { - yield ReturnSuccess::value(entry_builtin!(item, application.tag.clone())); - } else { - match ichwh::which(&item).await { - Ok(Some(path)) => yield ReturnSuccess::value(entry_path!(item, path.into(), application.tag.clone())), - Ok(None) => yield Err(ShellError::labeled_error( - "Binary not found for argument, and argument is not a builtin", - "not found", - &application.tag, - )), - Err(_) => yield Err(ShellError::labeled_error( - "Error trying to find binary for argument", - "error", - &application.tag, - )), - } - } - }; - - Ok(stream.to_output_stream()) + Ok(stream.take(1).to_output_stream()) } }