mirror of
https://github.com/MeiK2333/river.git
synced 2025-11-04 14:49:40 +08:00
Update
This commit is contained in:
parent
5289506886
commit
2fe45f3bfd
@ -1,3 +1,30 @@
|
|||||||
|
use lazy_static::lazy_static;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
pub static STDIN_FILENAME: &str = "stdin.txt";
|
pub static STDIN_FILENAME: &str = "stdin.txt";
|
||||||
pub static STDOUT_FILENAME: &str = "stdout.txt";
|
pub static STDOUT_FILENAME: &str = "stdout.txt";
|
||||||
pub static STDERR_FILENAME: &str = "stderr.txt";
|
pub static STDERR_FILENAME: &str = "stderr.txt";
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
pub static ref CONFIG: Config = {
|
||||||
|
let config = fs::read_to_string("config.yaml").unwrap();
|
||||||
|
let cg: Config = serde_yaml::from_str(&config).unwrap();
|
||||||
|
debug!("{:?}", cg);
|
||||||
|
cg
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub struct LanguageConf {
|
||||||
|
pub compile_cmd: String,
|
||||||
|
pub code_file: String,
|
||||||
|
pub run_cmd: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub struct Config {
|
||||||
|
pub data_dir: String,
|
||||||
|
pub languages: HashMap<String, LanguageConf>,
|
||||||
|
}
|
||||||
|
|||||||
@ -14,6 +14,7 @@ pub enum Error {
|
|||||||
StringToCStringError(NulError),
|
StringToCStringError(NulError),
|
||||||
ParseIntError(std::num::ParseIntError),
|
ParseIntError(std::num::ParseIntError),
|
||||||
CreateTempDirError(io::Error),
|
CreateTempDirError(io::Error),
|
||||||
|
CustomError(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type Result<T> = result::Result<T, Error>;
|
pub type Result<T> = result::Result<T, Error>;
|
||||||
|
|||||||
@ -1 +1,28 @@
|
|||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
use std::println as debug;
|
||||||
|
|
||||||
|
pub async fn compile(language: &str, code: &str, path: &Path) {
|
||||||
|
debug!("language: {}", language);
|
||||||
|
debug!("code: {}", code);
|
||||||
|
debug!("path: {:?}", path);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn judge(
|
||||||
|
language: &str,
|
||||||
|
in_file: &str,
|
||||||
|
out_file: &str,
|
||||||
|
time_limit: i32,
|
||||||
|
memory_limit: i32,
|
||||||
|
judge_type: i32,
|
||||||
|
path: &Path,
|
||||||
|
) {
|
||||||
|
debug!("language: {}", language);
|
||||||
|
debug!("in_file: {}", in_file);
|
||||||
|
debug!("out_file: {}", out_file);
|
||||||
|
debug!("time_limit: {}", time_limit);
|
||||||
|
debug!("memory_limit: {}", memory_limit);
|
||||||
|
debug!("judge_type: {}", judge_type);
|
||||||
|
debug!("path: {:?}", path);
|
||||||
|
}
|
||||||
|
|||||||
70
src/main.rs
70
src/main.rs
@ -1,4 +1,4 @@
|
|||||||
#![recursion_limit = "256"]
|
#![recursion_limit = "512"]
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate log;
|
extern crate log;
|
||||||
|
|
||||||
@ -20,6 +20,7 @@ mod cgroup;
|
|||||||
mod exec_args;
|
mod exec_args;
|
||||||
mod judger;
|
mod judger;
|
||||||
mod process;
|
mod process;
|
||||||
|
mod result;
|
||||||
mod seccomp;
|
mod seccomp;
|
||||||
|
|
||||||
pub mod river {
|
pub mod river {
|
||||||
@ -40,44 +41,59 @@ impl River for RiverService {
|
|||||||
) -> Result<Response<Self::JudgeStream>, Status> {
|
) -> Result<Response<Self::JudgeStream>, Status> {
|
||||||
let mut stream = request.into_inner();
|
let mut stream = request.into_inner();
|
||||||
|
|
||||||
// 此处编译很慢
|
|
||||||
// 为啥,是 try_stream! 这个宏导致的吗?
|
|
||||||
// 同时内部代码无法被 cargo fmt 格式化
|
|
||||||
// why?
|
|
||||||
let output = async_stream::try_stream! {
|
let output = async_stream::try_stream! {
|
||||||
|
let pwd = match tempdir_in("/tmp") {
|
||||||
|
Ok(val) => val,
|
||||||
|
Err(e) => {
|
||||||
|
yield result::system_error(error::Error::IOError(e));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
while let Some(req) = stream.next().await {
|
while let Some(req) = stream.next().await {
|
||||||
let req = req?;
|
let req = req?;
|
||||||
// TODO
|
let mut language = String::from("");
|
||||||
let pwd = tempdir_in("/tmp").unwrap();
|
let result = match &req.data {
|
||||||
match &req.data {
|
|
||||||
Some(Data::CompileData(data)) => {
|
Some(Data::CompileData(data)) => {
|
||||||
debug!("compile request");
|
debug!("compile request");
|
||||||
let language = &data.language;
|
language = String::from(&data.language);
|
||||||
|
let cfg = config::CONFIG.languages.get(&language);
|
||||||
|
debug!("{:?}", cfg);
|
||||||
let code = &data.code;
|
let code = &data.code;
|
||||||
debug!("language: {}", language);
|
judger::compile(&language, &code, &pwd.path()).await;
|
||||||
debug!("code: {}", code);
|
JudgeResponse {
|
||||||
break;
|
state: Some(river::judge_response::State::Status(river::JudgeStatus::Pending as i32))
|
||||||
|
}
|
||||||
},
|
},
|
||||||
Some(Data::JudgeData(data)) => {
|
Some(Data::JudgeData(data)) => {
|
||||||
debug!("judge request");
|
debug!("judge request");
|
||||||
let in_file = &data.in_file;
|
let in_file = &data.in_file;
|
||||||
let out_file = &data.out_file;
|
let out_file = &data.out_file;
|
||||||
let time_limit = &data.time_limit;
|
let time_limit = data.time_limit;
|
||||||
let memory_limit = &data.memory_limit;
|
let memory_limit = data.memory_limit;
|
||||||
let judge_type = &data.judge_type;
|
let judge_type = data.judge_type;
|
||||||
debug!("in_file: {}", in_file);
|
if language == "" {
|
||||||
debug!("out_file: {}", out_file);
|
// error::Error::CustomError(String::from("not compiled"));
|
||||||
debug!("time_limit: {}", time_limit);
|
JudgeResponse {
|
||||||
debug!("memory_limit: {}", memory_limit);
|
state: Some(river::judge_response::State::Status(river::JudgeStatus::Pending as i32))
|
||||||
debug!("judge_type: {}", judge_type);
|
}
|
||||||
break;
|
} else {
|
||||||
|
judger::judge(&language, &in_file, &out_file, time_limit, memory_limit, judge_type, &pwd.path()).await;
|
||||||
|
JudgeResponse {
|
||||||
|
state: Some(river::judge_response::State::Status(river::JudgeStatus::Pending as i32))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
None => JudgeResponse {
|
||||||
|
state: Some(river::judge_response::State::Status(river::JudgeStatus::Pending as i32))
|
||||||
|
},
|
||||||
|
_ => JudgeResponse {
|
||||||
|
state: Some(river::judge_response::State::Status(river::JudgeStatus::Pending as i32))
|
||||||
},
|
},
|
||||||
None => break,
|
|
||||||
_ => break,
|
|
||||||
};
|
};
|
||||||
}
|
// TODO
|
||||||
yield JudgeResponse {
|
yield JudgeResponse {
|
||||||
state: Some(river::judge_response::State::Status(river::JudgeStatus::Pending as i32))
|
state: Some(river::judge_response::State::Status(river::JudgeStatus::Pending as i32))
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
15
src/result.rs
Normal file
15
src/result.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
use crate::error::Error;
|
||||||
|
use crate::river::judge_response::State;
|
||||||
|
use crate::river::{JudgeResponse, JudgeResult, JudgeResultEnum};
|
||||||
|
|
||||||
|
pub fn system_error(err: Error) -> JudgeResponse {
|
||||||
|
warn!("{:?}", err);
|
||||||
|
JudgeResponse {
|
||||||
|
state: Some(State::Result(JudgeResult {
|
||||||
|
time_used: 0,
|
||||||
|
memory_used: 0,
|
||||||
|
result: JudgeResultEnum::SystemError as i32,
|
||||||
|
errmsg: format!("{}", err).into(),
|
||||||
|
})),
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user