mars/src/server.rs

160 lines
4.3 KiB
Rust
Raw Permalink Normal View History

2019-02-27 11:09:38 +01:00
#[macro_use]
extern crate log;
2018-09-24 14:32:12 +02:00
2023-10-12 15:49:26 +02:00
use std::process::exit;
use std::sync::{mpsc, Arc, Mutex};
use std::{env, thread};
2018-09-25 11:27:28 +02:00
use colored::*;
use percent_encoding::percent_decode;
2018-09-24 17:55:05 +02:00
use hyper::rt::Future;
2023-10-12 15:49:26 +02:00
use hyper::service::service_fn_ok;
use hyper::{Body, Response, Server};
2018-09-24 17:55:05 +02:00
2023-10-12 15:49:26 +02:00
use mars::{builder_arguments_from_string, watch, GeneralBuilder};
2018-09-24 17:55:05 +02:00
2018-09-25 11:27:28 +02:00
fn main() {
2019-02-27 11:09:38 +01:00
beautylog::init(log::LevelFilter::Info).ok();
2023-10-12 15:49:26 +02:00
let mut args = env::args()
.skip(1)
.collect::<Vec<_>>()
.into_iter()
.peekable();
let mut watching = None;
2023-10-12 16:25:37 +02:00
let mut command = None;
2023-10-12 15:49:26 +02:00
let mut ignore = vec![];
let exit_code = loop {
let arg = args.next();
let arg = arg.as_deref();
let next = args.peek();
let next = next.as_deref();
let watch_is_some = watching.is_some();
2023-10-12 16:25:37 +02:00
let command_is_some = command.is_some();
2023-10-12 15:49:26 +02:00
2023-10-12 16:25:37 +02:00
match (arg, next, watch_is_some, command_is_some) {
(None, _, _, _) => {
2023-10-12 15:49:26 +02:00
break None;
}
2023-10-12 16:25:37 +02:00
(Some("-w") | Some("--watch"), Some(value), false, _) => {
2023-10-12 15:49:26 +02:00
watching = Some(value.to_string());
}
2023-10-12 16:25:37 +02:00
(Some("-w") | Some("--watch"), Some(_), true, _) => {
2023-10-12 15:49:26 +02:00
error!("argument watch present multiple times");
break Some(1);
}
2023-10-12 16:25:37 +02:00
(Some("-w") | Some("--watch"), None, _, _) => {
2023-10-12 15:49:26 +02:00
error!("argument watch without value");
break Some(1);
}
2019-04-02 12:00:33 +02:00
2023-10-12 16:25:37 +02:00
(Some("-i") | Some("--ignore"), Some(value), _, _) => {
2023-10-12 15:49:26 +02:00
ignore.push(value.to_string());
}
2023-10-12 16:25:37 +02:00
(Some("-i") | Some("--ignore"), None, _, _) => {
2023-10-12 15:49:26 +02:00
error!("argument ignore without value");
break Some(1);
}
2023-10-12 16:25:37 +02:00
(Some("-c") | Some("--command"), Some(value), _, false) => {
command = Some(value.to_string());
}
(Some("-c") | Some("--command"), Some(_), _, true) => {
error!("argument command present multiple times");
break Some(1);
}
(Some("-c") | Some("--command"), None, _, _) => {
error!("argument command without value");
break Some(1);
}
(Some(value), _, _, _) => {
2023-10-12 15:49:26 +02:00
error!("argument \"{}\" unknown", value);
break Some(1);
}
}
args.next();
};
if let Some(exit_code) = exit_code {
exit(exit_code);
}
if let Some(watching) = watching {
2023-10-12 16:25:37 +02:00
if let Err(e) = watch(&watching, ignore, command) {
2019-07-05 14:07:36 +02:00
error!("{}", e);
2023-10-12 15:49:26 +02:00
exit(1);
2019-04-02 12:00:33 +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 || {
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
})
2019-02-27 11:09:38 +01:00
.map_err(|e| error!("server error: {}", e));
2018-09-24 14:32:12 +02:00
2019-02-27 11:09:38 +01:00
info!("mars server listening on {}...", addr);
2018-09-25 11:27:28 +02:00
hyper::rt::run(server);
});
let mut builder = GeneralBuilder::new();
2018-09-25 11:27:28 +02:00
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();
2023-10-12 15:49:26 +02:00
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());
2023-10-12 15:49:26 +02:00
}
Ok(_) => {
println!("{}", "----- SUCCESSFUL -----".bold().green());
2023-10-12 15:49:26 +02:00
}
};
println!();
2018-09-25 11:27:28 +02:00
}
}
2018-09-24 14:32:12 +02:00
}