summaryrefslogtreecommitdiffstats
path: root/src/backends/python.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/python.rs')
-rw-r--r--src/backends/python.rs43
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