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!(); }); } } }