mars/src/server.rs

79 lines
2.1 KiB
Rust
Raw Normal View History

2018-09-25 11:27:28 +02:00
extern crate colored;
extern crate percent_encoding;
2018-09-24 14:32:12 +02:00
extern crate hyper;
2018-09-24 17:55:05 +02:00
extern crate mars;
2018-09-24 14:32:12 +02:00
2018-09-25 11:27:28 +02:00
use std::thread;
use std::sync::{Mutex, Arc, mpsc};
use colored::*;
use percent_encoding::percent_decode;
2018-09-25 11:27:28 +02:00
use hyper::{Body, Response, Server};
2018-09-24 14:32:12 +02:00
use hyper::service::service_fn_ok;
2018-09-24 17:55:05 +02:00
use hyper::rt::Future;
use mars::{GeneralBuilder, builder_arguments_from_string};
2018-09-24 17:55:05 +02:00
2018-09-25 11:27:28 +02:00
fn main() {
2018-09-24 17:55:05 +02:00
2018-09-25 11:27:28 +02:00
let (tx, rx) = mpsc::channel();
2018-09-24 17:55:05 +02:00
2018-09-25 11:27:28 +02:00
let tasks = Arc::new(Mutex::new(vec![]));
let clone = tasks.clone();
2018-09-24 14:32:12 +02:00
2018-09-25 11:27:28 +02:00
thread::spawn(move || {
2018-09-24 14:32:12 +02:00
2018-09-25 11:27:28 +02:00
let addr = ([127, 0, 0, 1], 1500).into();
2018-09-24 14:32:12 +02:00
2018-09-25 11:27:28 +02:00
let server = Server::bind(&addr)
.serve(move || {
let clone = clone.clone();
let tx_clone = tx.clone();
let r = service_fn_ok(move |r| {
2018-09-25 15:42:41 +02:00
clone.lock().unwrap().push(r.uri().clone());
2018-09-25 11:27:28 +02:00
tx_clone.send(()).unwrap();
Response::new(Body::from("Ok"))
});
r
})
.map_err(|e| eprintln!("server error: {}", e));
2018-09-24 14:32:12 +02:00
2018-09-25 14:53:33 +02:00
println!("{}", format!("Mars server listening on {}...", addr).bold().green());
2018-09-25 11:27:28 +02:00
hyper::rt::run(server);
});
for _ in rx {
let mut tasks = tasks.lock().unwrap();
2018-09-25 15:42:41 +02:00
while let Some(uri) = tasks.pop() {
2018-09-25 11:27:28 +02:00
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!();
});
2018-09-25 11:27:28 +02:00
}
}
2018-09-24 14:32:12 +02:00
}