mirror of
https://github.com/nushell/nushell.git
synced 2025-06-30 22:50:14 +02:00
Externals now spawn independently. (#1230)
This commit changes the way we shell out externals when using the `"$it"` argument. Also pipes per row to an external's stdin if no `"$it"` argument is present for external commands. Further separation of logic (preparing the external's command arguments, getting the data for piping, emitting values, spawning processes) will give us a better idea for lower level details regarding external commands until we can find the right abstractions for making them more generic and unify within the pipeline calling logic of Nu internal's and external's.
This commit is contained in:
committed by
GitHub
parent
d29fe6f6de
commit
29431e73c2
@ -6,6 +6,16 @@ pub struct ExternalArg {
|
||||
pub tag: Tag,
|
||||
}
|
||||
|
||||
impl ExternalArg {
|
||||
pub fn has(&self, name: &str) -> bool {
|
||||
self.arg == name
|
||||
}
|
||||
|
||||
pub fn is_it(&self) -> bool {
|
||||
self.has("$it")
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::Deref for ExternalArg {
|
||||
type Target = str;
|
||||
|
||||
@ -42,6 +52,12 @@ pub struct ExternalCommand {
|
||||
pub args: ExternalArgs,
|
||||
}
|
||||
|
||||
impl ExternalCommand {
|
||||
pub fn has_it_argument(&self) -> bool {
|
||||
self.args.iter().any(|arg| arg.has("$it"))
|
||||
}
|
||||
}
|
||||
|
||||
impl PrettyDebug for ExternalCommand {
|
||||
fn pretty(&self) -> DebugDocBuilder {
|
||||
b::typed(
|
||||
|
@ -10,6 +10,9 @@ license = "MIT"
|
||||
doctest = false
|
||||
|
||||
[dependencies]
|
||||
nu-parser = { path = "../nu-parser", version = "0.8.0" }
|
||||
nu-source = { path = "../nu-source", version = "0.8.0" }
|
||||
|
||||
app_dirs = "1.2.1"
|
||||
dunce = "1.0.0"
|
||||
getset = "0.0.9"
|
||||
|
50
crates/nu-test-support/src/commands.rs
Normal file
50
crates/nu-test-support/src/commands.rs
Normal file
@ -0,0 +1,50 @@
|
||||
use nu_parser::commands::classified::external::{ExternalArg, ExternalArgs, ExternalCommand};
|
||||
use nu_source::{Span, SpannedItem, Tag, TaggedItem};
|
||||
|
||||
pub struct ExternalBuilder {
|
||||
name: String,
|
||||
args: Vec<String>,
|
||||
}
|
||||
|
||||
impl ExternalBuilder {
|
||||
pub fn for_name(name: &str) -> ExternalBuilder {
|
||||
ExternalBuilder {
|
||||
name: name.to_string(),
|
||||
args: vec![],
|
||||
}
|
||||
}
|
||||
|
||||
pub fn arg(&mut self, value: &str) -> &mut Self {
|
||||
self.args.push(value.to_string());
|
||||
self
|
||||
}
|
||||
|
||||
pub fn build(&mut self) -> ExternalCommand {
|
||||
let mut path = crate::fs::binaries();
|
||||
path.push(&self.name);
|
||||
|
||||
let name = path.to_string_lossy().to_string().spanned(Span::unknown());
|
||||
|
||||
let args = self
|
||||
.args
|
||||
.iter()
|
||||
.map(|arg| {
|
||||
let arg = arg.tagged(Tag::unknown());
|
||||
|
||||
ExternalArg {
|
||||
arg: arg.to_string(),
|
||||
tag: arg.tag,
|
||||
}
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
ExternalCommand {
|
||||
name: name.to_string(),
|
||||
name_tag: Tag::unknown(),
|
||||
args: ExternalArgs {
|
||||
list: args,
|
||||
span: name.span,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
@ -1,8 +1,13 @@
|
||||
use std::io::{self, BufRead};
|
||||
|
||||
fn main() {
|
||||
let stdin = io::stdin();
|
||||
if did_chop_arguments() {
|
||||
// we are done and don't care about standard input.
|
||||
std::process::exit(0);
|
||||
}
|
||||
|
||||
// if no arguments given, chop from standard input and exit.
|
||||
let stdin = io::stdin();
|
||||
let mut input = stdin.lock().lines();
|
||||
|
||||
if let Some(Ok(given)) = input.next() {
|
||||
@ -20,3 +25,20 @@ fn chop(word: &str) -> &str {
|
||||
|
||||
&word[..to]
|
||||
}
|
||||
|
||||
fn did_chop_arguments() -> bool {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
|
||||
if args.len() > 1 {
|
||||
let mut arguments = args.iter();
|
||||
arguments.next();
|
||||
|
||||
for arg in arguments {
|
||||
println!("{}", chop(arg));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
false
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
pub mod commands;
|
||||
pub mod fs;
|
||||
pub mod macros;
|
||||
pub mod playground;
|
||||
|
Reference in New Issue
Block a user