mars/src/server.rs

87 lines
2.2 KiB
Rust

#[macro_use]
extern crate log;
use std::{thread, env};
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, watch};
fn main() {
beautylog::init(log::LevelFilter::Info).ok();
let args = env::args().collect::<Vec<_>>();
if args.len() == 3 && args[1] == "-w" {
if let Err(e) = watch(&args[2]) {
error!("{:?}", e);
}
}
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| error!("server error: {}", e));
info!("mars server listening on {}...", addr);
hyper::rt::run(server);
});
let mut builder = GeneralBuilder::new();
for _ in rx {
let uri = {
let mut tasks = tasks.lock().unwrap();
tasks.pop()
};
if let Some(uri) = uri {
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!();
}
}
}