From 7af2343e276d3040937a6b2e075b4557b83aeb0e Mon Sep 17 00:00:00 2001 From: syn Date: Sat, 18 Jan 2020 21:27:11 +0300 Subject: Extract 'stdin from file' & add to clang --- src/backends/clang.rs | 5 ++++- src/backends/mod.rs | 19 +++++++++++++++++++ src/backends/python.rs | 21 +++------------------ 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/backends/clang.rs b/src/backends/clang.rs index b732ed5..6248218 100644 --- a/src/backends/clang.rs +++ b/src/backends/clang.rs @@ -78,7 +78,10 @@ impl Backend for ClangBackend { fn run(&self, fname: &Path) -> Result { let binary_fname = self.build(fname)?; - let binary_proc = Command::new(&binary_fname).spawn()?; + let binary_proc = Command::new(&binary_fname) + .stdin(self.get_stdin(fname)) + .spawn()?; + get_status(binary_proc) } } diff --git a/src/backends/mod.rs b/src/backends/mod.rs index 25ac164..010c4d9 100644 --- a/src/backends/mod.rs +++ b/src/backends/mod.rs @@ -3,6 +3,9 @@ use std::env::temp_dir; use lazy_static::lazy_static; use std::io::{ Error, ErrorKind, Result }; use nix::sys::signal::Signal as NixSignal; +use std::process::Stdio; +use std::fs::File; +use log::warn; pub mod python; pub mod clang; @@ -33,6 +36,22 @@ pub trait Backend { } None } + + fn get_stdin(&self, fname: &Path) -> Stdio { + match self.try_guess_test_file(fname) { + Some(test_filename) => match File::open(&test_filename) { + Ok(test_content) => { + println!("Using {}", test_filename.as_path().display()); + Stdio::from(test_content) + }, + Err(err) => { + warn!("Could not open test file. Fallback to piped: {}", err); + Stdio::piped() + } + }, + None => Stdio::piped() + } + } } fn mk_tmp_dir() -> Result<&'static std::path::PathBuf> { diff --git a/src/backends/python.rs b/src/backends/python.rs index 8c95e2c..f1d0e4d 100644 --- a/src/backends/python.rs +++ b/src/backends/python.rs @@ -1,9 +1,8 @@ use serde_derive::{ Serialize, Deserialize }; use crate::backends::{ Backend, RunStatus }; -use std::process::{ Command, Stdio }; +use std::process::{ Command }; use std::path::Path; -use std::fs::File; -use log::{ warn, error }; +use log::error; use wait_timeout::ChildExt; #[derive(Debug, Serialize, Deserialize, Default)] @@ -35,25 +34,11 @@ impl Backend for PythonBackend { } fn run(&self, fname: &Path) -> std::io::Result { - let stdio = match self.try_guess_test_file(fname) { - Some(test_filename) => match File::open(&test_filename) { - Ok(test_content) => { - println!("Using {}", test_filename.as_path().display()); - Stdio::from(test_content) - }, - Err(err) => { - warn!("Could not open test file. Fallback to piped: {}", err); - Stdio::piped() - } - }, - None => Stdio::piped() - }; - let timer = std::time::SystemTime::now(); let mut child = Command::new(self.get_interpreter()) .arg(fname.as_os_str()) - .stdin(stdio) + .stdin(self.get_stdin(fname)) .spawn()?; let timeout = std::time::Duration::from_secs_f32(self.timeout.unwrap_or(1.0)); -- cgit v1.2.1-18-gbd029