From 2b6c363fcae6e035fd62222f4c4ba5c2444c08b4 Mon Sep 17 00:00:00 2001 From: Jonas Zeunert Date: Mon, 22 Apr 2024 23:09:20 +0200 Subject: [PATCH] Improve CLI --- Cargo.lock | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 30 ++++++++++++++++++++++++++++-- 3 files changed, 82 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index abb5e36..deb7ad9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -126,6 +126,7 @@ checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" name = "awesm" version = "0.1.0" dependencies = [ + "clap", "env_logger", "lazy_static", "log", @@ -248,6 +249,46 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" +[[package]] +name = "clap" +version = "4.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" + [[package]] name = "colorchoice" version = "1.0.0" @@ -495,6 +536,12 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -1236,6 +1283,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "syn" version = "2.0.60" diff --git a/Cargo.toml b/Cargo.toml index 1e1d94b..6dcd8a1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +clap = { version = "4.5.4", features = ["derive"] } env_logger = "0.11.3" lazy_static = "1.4.0" log = "0.4.21" diff --git a/src/main.rs b/src/main.rs index 7b77a26..8295e36 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,40 @@ +use clap::Parser; use log::info; - +use std::net::{IpAddr, TcpListener}; mod options; mod server; mod elastic_query; mod elastic_response; +#[derive(Parser, Debug)] +struct Args { + #[clap(short, long, default_value = "::1")] + bind_address: IpAddr, + + #[clap(short, long, default_value_t = 9876)] + port: u16, +} + fn main() { env_logger::init(); + let args = Args::parse(); + info!("Starting server..."); - rouille::start_server("0.0.0.0:80", move |request| server::serve_request(request)); + + let next_free_port = find_available_port(args.bind_address, args.port); + + rouille::start_server((args.bind_address, next_free_port), move |request| { + server::serve_request(request) + }); +} + +fn find_available_port(address: IpAddr, from: u16) -> u16 { + (from..u16::MAX) + .find(|port| match TcpListener::bind((address, *port)) { + Ok(_) => true, + Err(_) => false, + }) + .unwrap_or_else(|| panic!("Could not find any available port starting from {}!", from)) }