diff --git a/hel/src/utils.rs b/hel/src/utils.rs index 15936fb..2c1c668 100644 --- a/hel/src/utils.rs +++ b/hel/src/utils.rs @@ -2,7 +2,7 @@ use shlex::split; use std::env; use std::ffi::OsString; use std::io; -use std::io::{Read, Write}; +use std::io::Write; use std::process::{Command, Stdio}; pub mod date { @@ -204,18 +204,22 @@ pub mod editor { } pub fn call_cmd_with_input(cmd: &str, args: &Vec, input: &str) -> io::Result { - let mut cmd = Command::new(cmd).args(args).stdin(Stdio::piped()).stdout(Stdio::piped()).spawn()?; - let mut stdin = cmd.stdin.take().unwrap(); - let stdout = cmd.stdout.as_mut().unwrap(); - let in_data = input.to_string(); - let write_handle = std::thread::spawn(move || stdin.write_all(in_data.as_bytes())); - let mut output = Vec::new(); - stdout.read_to_end(&mut output)?; - match write_handle.join() { - Ok(_) => (), - Err(_) => return Err(io::Error::new(io::ErrorKind::Other, "Failed to run command")), + let mut cmd = Command::new(cmd) + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn()?; + + { + let stdin = cmd.stdin.as_mut().unwrap(); + stdin + .write_all(input.as_bytes()) + .expect("Failed to write input to stdin"); } - match String::from_utf8(output) { + + let output = cmd.wait_with_output()?; + + match String::from_utf8(output.stdout) { Ok(x) => Ok(x), Err(err) => Err(io::Error::new(io::ErrorKind::InvalidData, err.utf8_error())), } @@ -270,4 +274,13 @@ line 4"### "test is ok".to_string() ); } + + #[test] + fn check_correct_stdin() { + let cmd = "cat"; + let args = vec![]; + let input = "Hello World!"; + let output = call_cmd_with_input(cmd, &args, input).unwrap(); + assert_eq!(output, "Hello World!"); + } }