river/src/main.rs
2021-01-07 19:40:47 +08:00

70 lines
1.6 KiB
Rust

#![recursion_limit = "256"]
#[macro_use]
extern crate log;
use env_logger::Env;
use futures_core::Stream;
use river::river_server::{River, RiverServer};
use river::{JudgeRequest, JudgeResponse};
use std::pin::Pin;
use tonic::transport::Server;
use tonic::{Request, Response, Status};
mod config;
mod error;
mod cgroup;
mod exec_args;
mod process;
mod seccomp;
pub mod river {
tonic::include_proto!("river");
}
#[derive(Debug, Default)]
pub struct RiverService {}
#[tonic::async_trait]
impl River for RiverService {
type JudgeStream =
Pin<Box<dyn Stream<Item = Result<JudgeResponse, Status>> + Send + Sync + 'static>>;
async fn judge(
&self,
request: Request<tonic::Streaming<JudgeRequest>>,
) -> Result<Response<Self::JudgeStream>, Status> {
let mut _stream = request.into_inner();
let output = async_stream::try_stream! {
yield JudgeResponse {
state: Some(river::judge_response::State::Status(river::JudgeStatus::Pending as i32))
};
};
Ok(Response::new(Box::pin(output) as Self::JudgeStream))
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let env = Env::default()
.filter_or("LOG_LEVEL", "debug,h2=info,hyper=info")
.write_style_or("LOG_STYLE", "always");
env_logger::init_from_env(env);
let addr = "0.0.0.0:4003".parse()?;
let river = RiverService::default();
info!("listen on: {}", addr);
Server::builder()
.concurrency_limit_per_connection(5)
.add_service(RiverServer::new(river))
.serve(addr)
.await?;
Ok(())
}