use std::{ net::{IpAddr, SocketAddr}, num::NonZeroUsize, thread::available_parallelism, }; use actix_web::{App, HttpServer}; use clap::{crate_name, crate_version, Parser}; #[derive(Parser, Debug)] #[clap(name = crate_name!(), version = crate_version!())] struct Args { /// Directory to expose #[clap(default_value = ".")] dir: String, /// IP address to use #[clap(default_value = "0.0.0.0")] ip: IpAddr, /// Port number to connect #[clap(default_value = "8080")] port: u16, } #[actix_web::main] async fn main() -> std::io::Result<()> { let args = Args::parse(); let dir = args.dir; let sock = SocketAddr::new(args.ip, args.port); println!("Starting HTTP server on {sock} exposing dir {dir}"); HttpServer::new(move || { App::new().service( actix_files::Files::new("/", dir.clone()) .show_files_listing() .prefer_utf8(true), ) }) .workers(available_parallelism().map_or(1, NonZeroUsize::get)) .bind(sock)? .run() .await }