use clap::Parser; use log::info; use std::net::{IpAddr, TcpListener}; mod options; mod server; mod elastic_query; mod elastic_response; mod search_result; #[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(); let next_free_port = find_available_port(args.bind_address, args.port); info!("Starting server on port {}...", next_free_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)) }