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