diff options
Diffstat (limited to 'src/backends/python.rs')
-rw-r--r-- | src/backends/python.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/backends/python.rs b/src/backends/python.rs new file mode 100644 index 0000000..2776eb2 --- /dev/null +++ b/src/backends/python.rs @@ -0,0 +1,43 @@ +use serde_derive::{ Serialize, Deserialize }; +use crate::backends::Backend; +use std::process::{ Command, Stdio }; +use std::path::Path; +use log::trace; +use std::io::{ Error, ErrorKind }; + +#[derive(Debug, Serialize, Deserialize, Default)] +pub struct PythonBackend { + template: Option<String>, + version: Option<String>, +} + +impl Backend for PythonBackend { + fn get_template(&self) -> Option<&str> { + match self.template { + Some(ref t) => Some(t), + None => None + } + } + + fn run(&self, fname: &Path) -> std::io::Result<()> { + let interpreter = format!("python{}", self.version.as_ref().unwrap_or(&String::new())); + let stdio = match self.try_guess_test(fname) { + Some(test_file) => Stdio::from(std::fs::File::open(test_file)?), + None => Stdio::piped() + }; + let timer = std::time::SystemTime::now(); + let mut child = Command::new(interpreter) + .arg(fname.as_os_str()) + .stdin(stdio) + .spawn()?; + + let status = child.wait()?; + if !status.success() { + return Err(Error::new(ErrorKind::Other, + "Process exited with non-zero exit code")); + } + trace!("elapsed: {:#?}", timer.elapsed()); + + Ok(()) + } +}
\ No newline at end of file |