mars/src/server.rs

79 lines
2.1 KiB
Rust

extern crate colored;
extern crate percent_encoding;
extern crate hyper;
extern crate mars;
use std::thread;
use std::sync::{Mutex, Arc, mpsc};
use colored::*;
use percent_encoding::percent_decode;
use hyper::{Body, Response, Server};
use hyper::service::service_fn_ok;
use hyper::rt::Future;
use mars::{GeneralBuilder, builder_arguments_from_string};
fn main() {
let (tx, rx) = mpsc::channel();
let tasks = Arc::new(Mutex::new(vec![]));
let clone = tasks.clone();
thread::spawn(move || {
let addr = ([127, 0, 0, 1], 1500).into();
let server = Server::bind(&addr)
.serve(move || {
let clone = clone.clone();
let tx_clone = tx.clone();
let r = service_fn_ok(move |r| {
clone.lock().unwrap().push(r.uri().clone());
tx_clone.send(()).unwrap();
Response::new(Body::from("Ok"))
});
r
})
.map_err(|e| eprintln!("server error: {}", e));
println!("{}", format!("Mars server listening on {}...", addr).bold().green());
hyper::rt::run(server);
});
for _ in rx {
let mut tasks = tasks.lock().unwrap();
while let Some(uri) = tasks.pop() {
thread::spawn(move || {
let builder = GeneralBuilder::new();
let uri = percent_decode(uri.path().as_bytes()).decode_utf8().unwrap();
let (path, args) = builder_arguments_from_string(&*uri);
let path_string = path.to_str().unwrap();
let start_string = format!("---- STARTING BUILD ---- from {} {}", path_string, args.join(" "));
println!("{}", start_string.bold().green());
match builder.build(&path, &args) {
Err(_) => {
println!("{}", "--------- FAIL ---------".bold().red());
},
Ok(_) => {
println!("{}", "----- SUCCESSFUL -----".bold().green());
},
};
println!();
});
}
}
}