mirror of
https://github.com/nushell/nushell.git
synced 2024-11-25 18:03:51 +01:00
Attempt so simplify classified
This commit is contained in:
parent
84628f298d
commit
9da896ad4e
@ -220,111 +220,60 @@ impl ExternalCommand {
|
|||||||
|
|
||||||
let mut process;
|
let mut process;
|
||||||
|
|
||||||
#[cfg(windows)]
|
process = Exec::cmd(&self.name);
|
||||||
{
|
|
||||||
process = Exec::shell(&self.name);
|
|
||||||
|
|
||||||
if arg_string.contains("$it") {
|
if arg_string.contains("$it") {
|
||||||
let mut first = true;
|
let mut first = true;
|
||||||
|
|
||||||
for i in &inputs {
|
|
||||||
if i.as_string().is_err() {
|
|
||||||
let mut span = None;
|
|
||||||
for arg in &self.args {
|
|
||||||
if arg.item.contains("$it") {
|
|
||||||
span = Some(arg.span());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if let Some(span) = span {
|
|
||||||
return Err(ShellError::labeled_error(
|
|
||||||
"External $it needs string data",
|
|
||||||
"given row instead of string data",
|
|
||||||
span,
|
|
||||||
));
|
|
||||||
} else {
|
|
||||||
return Err(ShellError::string("Error: $it needs string data"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !first {
|
|
||||||
process = process.arg("&&");
|
|
||||||
process = process.arg(&self.name);
|
|
||||||
} else {
|
|
||||||
first = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
for i in &inputs {
|
||||||
|
if i.as_string().is_err() {
|
||||||
|
let mut span = None;
|
||||||
for arg in &self.args {
|
for arg in &self.args {
|
||||||
if arg.chars().all(|c| c.is_whitespace()) {
|
if arg.item.contains("$it") {
|
||||||
continue;
|
span = Some(arg.span());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
process = process.arg(&arg.replace("$it", &i.as_string()?));
|
if let Some(span) = span {
|
||||||
|
return Err(ShellError::labeled_error(
|
||||||
|
"External $it needs string data",
|
||||||
|
"given row instead of string data",
|
||||||
|
span,
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
return Err(ShellError::string("Error: $it needs string data"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
if !first {
|
||||||
|
process = process.arg("&&");
|
||||||
|
process = process.arg(&self.name);
|
||||||
|
} else {
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
|
||||||
for arg in &self.args {
|
for arg in &self.args {
|
||||||
let arg_chars: Vec<_> = arg.chars().collect();
|
if arg.chars().all(|c| c.is_whitespace()) {
|
||||||
if arg_chars.len() > 1
|
continue;
|
||||||
&& arg_chars[0] == '"'
|
|
||||||
&& arg_chars[arg_chars.len() - 1] == '"'
|
|
||||||
{
|
|
||||||
// quoted string
|
|
||||||
let new_arg: String = arg_chars[1..arg_chars.len() - 1].iter().collect();
|
|
||||||
process = process.arg(new_arg);
|
|
||||||
} else {
|
|
||||||
process = process.arg(arg.item.clone());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
process = process.arg(&arg.replace("$it", &i.as_string()?));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for arg in &self.args {
|
||||||
|
let arg_chars: Vec<_> = arg.chars().collect();
|
||||||
|
if arg_chars.len() > 1
|
||||||
|
&& arg_chars[0] == '"'
|
||||||
|
&& arg_chars[arg_chars.len() - 1] == '"'
|
||||||
|
{
|
||||||
|
// quoted string
|
||||||
|
let new_arg: String = arg_chars[1..arg_chars.len() - 1].iter().collect();
|
||||||
|
process = process.arg(new_arg);
|
||||||
|
} else {
|
||||||
|
process = process.arg(arg.item.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[cfg(not(windows))]
|
|
||||||
{
|
|
||||||
let mut new_arg_string = self.name.to_string();
|
|
||||||
|
|
||||||
if arg_string.contains("$it") {
|
|
||||||
let mut first = true;
|
|
||||||
for i in &inputs {
|
|
||||||
let i = match i.as_string() {
|
|
||||||
Err(_err) => {
|
|
||||||
let mut span = name_span;
|
|
||||||
for arg in &self.args {
|
|
||||||
if arg.item.contains("$it") {
|
|
||||||
span = arg.span();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Err(ShellError::labeled_error(
|
|
||||||
"External $it needs string data",
|
|
||||||
"given row instead of string data",
|
|
||||||
span,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
Ok(val) => val,
|
|
||||||
};
|
|
||||||
|
|
||||||
if !first {
|
|
||||||
new_arg_string.push_str("&&");
|
|
||||||
new_arg_string.push_str(&self.name);
|
|
||||||
} else {
|
|
||||||
first = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for arg in &self.args {
|
|
||||||
if arg.chars().all(|c| c.is_whitespace()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
new_arg_string.push_str(" ");
|
|
||||||
new_arg_string.push_str(&arg.replace("$it", &i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for arg in &self.args {
|
|
||||||
new_arg_string.push_str(" ");
|
|
||||||
new_arg_string.push_str(&arg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
process = Exec::shell(new_arg_string);
|
|
||||||
}
|
|
||||||
process = process.cwd(context.shell_manager.path());
|
process = process.cwd(context.shell_manager.path());
|
||||||
|
|
||||||
let mut process = match stream_next {
|
let mut process = match stream_next {
|
||||||
|
@ -310,8 +310,7 @@ pub fn file_contents(full_path: impl AsRef<Path>) -> String {
|
|||||||
pub fn file_contents_binary(full_path: impl AsRef<Path>) -> Vec<u8> {
|
pub fn file_contents_binary(full_path: impl AsRef<Path>) -> Vec<u8> {
|
||||||
let mut file = std::fs::File::open(full_path.as_ref()).expect("can not open file");
|
let mut file = std::fs::File::open(full_path.as_ref()).expect("can not open file");
|
||||||
let mut contents = Vec::new();
|
let mut contents = Vec::new();
|
||||||
file.read_to_end(&mut contents)
|
file.read_to_end(&mut contents).expect("can not read file");
|
||||||
.expect("can not read file");
|
|
||||||
contents
|
contents
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,18 +326,6 @@ pub fn line_ending() -> String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn normalize_string(input: &str) -> String {
|
|
||||||
#[cfg(windows)]
|
|
||||||
{
|
|
||||||
input.to_string()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(windows))]
|
|
||||||
{
|
|
||||||
format!("\"{}\"", input)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn create_file_at(full_path: impl AsRef<Path>) -> Result<(), std::io::Error> {
|
pub fn create_file_at(full_path: impl AsRef<Path>) -> Result<(), std::io::Error> {
|
||||||
let full_path = full_path.as_ref();
|
let full_path = full_path.as_ref();
|
||||||
|
|
||||||
@ -377,13 +364,13 @@ pub fn in_directory(str: impl AsRef<Path>) -> String {
|
|||||||
str.as_ref().display().to_string()
|
str.as_ref().display().to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub fn pipeline(commands: &str) -> String {
|
pub fn pipeline(commands: &str) -> String {
|
||||||
commands.lines()
|
commands
|
||||||
.skip(1)
|
.lines()
|
||||||
.map(|line| line.trim())
|
.skip(1)
|
||||||
.collect::<Vec<&str>>()
|
.map(|line| line.trim())
|
||||||
.join(" ")
|
.collect::<Vec<&str>>()
|
||||||
.trim_end()
|
.join(" ")
|
||||||
.to_string()
|
.trim_end()
|
||||||
|
.to_string()
|
||||||
}
|
}
|
||||||
|
@ -38,9 +38,7 @@ fn external_has_correct_quotes() {
|
|||||||
r#"echo "hello world""#
|
r#"echo "hello world""#
|
||||||
);
|
);
|
||||||
|
|
||||||
let actual = h::normalize_string(&actual);
|
assert_eq!(actual, r#"hello world"#);
|
||||||
|
|
||||||
assert_eq!(actual, r#""hello world""#);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
Loading…
Reference in New Issue
Block a user