(feat) add php executor
This commit is contained in:
parent
ca8c439df6
commit
63b9f40815
|
@ -1,13 +1,14 @@
|
||||||
use crate::executor::python::PythonExecutor;
|
use crate::executor::{php::PhpExecutor, python::PythonExecutor};
|
||||||
|
|
||||||
|
|
||||||
|
pub mod php;
|
||||||
pub mod python;
|
pub mod python;
|
||||||
|
|
||||||
pub mod helper;
|
pub mod helper;
|
||||||
|
|
||||||
pub fn executors() -> Vec<Box<dyn Executor>> {
|
pub fn executors() -> Vec<Box<dyn Executor>> {
|
||||||
vec![
|
vec![
|
||||||
|
Box::new(PhpExecutor {}),
|
||||||
Box::new(PythonExecutor {}),
|
Box::new(PythonExecutor {}),
|
||||||
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use std::{fs::create_dir_all, process::ExitStatus};
|
use std::{fs::create_dir_all, io::Read, process::{ChildStdout, ExitStatus}};
|
||||||
|
|
||||||
use rand::{distributions::Alphanumeric, Rng, thread_rng};
|
use rand::{distributions::Alphanumeric, Rng, thread_rng};
|
||||||
|
|
||||||
|
@ -28,3 +28,17 @@ pub fn exit_code_msg(code: ExitStatus) -> String {
|
||||||
"Command exited with unknown code".into()
|
"Command exited with unknown code".into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_stdout(stdout: Option<ChildStdout>) -> Result<String, String> {
|
||||||
|
let ret = {
|
||||||
|
if let Some(mut sout) = stdout {
|
||||||
|
let mut buf = vec![];
|
||||||
|
sout.read_to_end(&mut buf).map_err(|x| x.to_string())?;
|
||||||
|
String::from_utf8(buf).map_err(|x| x.to_string())?
|
||||||
|
} else {
|
||||||
|
"Couldn't get stdout from the process".into()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(ret)
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
use std::fs;
|
||||||
|
use std::process::Command;
|
||||||
|
use std::process::Stdio;
|
||||||
|
|
||||||
|
use super::Executor;
|
||||||
|
|
||||||
|
use super::helper::*;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub struct PhpExecutor {}
|
||||||
|
|
||||||
|
impl Executor for PhpExecutor {
|
||||||
|
fn id(&self) -> String {
|
||||||
|
"php".into()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn exec(&self, code: String) -> Result<String, String> {
|
||||||
|
assure_dir_exists().map_err(|x| x.to_string())?;
|
||||||
|
|
||||||
|
let path = create_path();
|
||||||
|
|
||||||
|
// 1. Save the code
|
||||||
|
fs::write(path.clone(), code).map_err(|x| x.to_string())?;
|
||||||
|
|
||||||
|
// 2. Run it!
|
||||||
|
let mut out = Command::new("php")
|
||||||
|
.arg(path)
|
||||||
|
.stdout(Stdio::piped())
|
||||||
|
.spawn()
|
||||||
|
.map_err(|x| x.to_string())?;
|
||||||
|
|
||||||
|
// 3. Grab the exit code
|
||||||
|
let exit_status = out.wait().map_err(|x| x.to_string())?;
|
||||||
|
|
||||||
|
let mut stdout: String = get_stdout(out.stdout)?;
|
||||||
|
|
||||||
|
stdout += "\n\n";
|
||||||
|
stdout += exit_code_msg(exit_status).as_str();
|
||||||
|
|
||||||
|
Ok(stdout)
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,7 +2,7 @@ use serde::{Serialize, Deserialize};
|
||||||
|
|
||||||
use warp::{reject::Rejection, reply::{json, with_status, Reply}, Filter, http::StatusCode};
|
use warp::{reject::Rejection, reply::{json, with_status, Reply}, Filter, http::StatusCode};
|
||||||
|
|
||||||
use crate::{executor::{executors, executors_id, get_executor, python::PythonExecutor, Executor}, SharedState};
|
use crate::{executor::{executors, get_executor}, SharedState};
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
struct ExecutorData {
|
struct ExecutorData {
|
||||||
|
|
Loading…
Reference in New Issue