|
|
|
|
|
|
|
|
|
|
|
use std::{ops::RangeInclusive, net::TcpListener}; |
|
|
|
use clap::{command, Parser}; |
|
use env_logger::Env; |
|
use websurfx::run; |
|
|
|
|
|
#[derive(Parser, Debug, Default)] |
|
#[clap(author = "neon_arch", version, about = "Websurfx server application")] |
|
#[command(propagate_version = true)] |
|
struct CliArgs { |
|
#[clap(default_value_t = 8080, short, long,value_parser = is_port_in_range)] |
|
|
|
port: u16, |
|
} |
|
|
|
const PORT_RANGE: RangeInclusive<usize> = 1024..=65535; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fn is_port_in_range(s: &str) -> Result<u16, String> { |
|
let port: usize = s |
|
.parse() |
|
.map_err(|_| format!("`{s}` is not a valid port number"))?; |
|
if PORT_RANGE.contains(&port) { |
|
Ok(port as u16) |
|
} else { |
|
Err(format!( |
|
"port not found in range {}-{}", |
|
PORT_RANGE.start(), |
|
PORT_RANGE.end() |
|
)) |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[actix_web::main] |
|
async fn main() -> std::io::Result<()> { |
|
let args = CliArgs::parse(); |
|
|
|
|
|
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); |
|
|
|
log::info!("started server on port {}", args.port); |
|
|
|
let listener = TcpListener::bind(("127.0.0.1", args.port))?; |
|
|
|
run(listener)?.await |
|
} |
|
|