use clap::Parser;
#[derive(Parser, Debug, Clone)]
#[command(
name = "serve",
about = "Static file serving and directory listing",
disable_help_flag = true,
disable_version_flag = true,
after_help = "ENDPOINTS\n\n\
Listen endpoints (specified by the --listen or -l options above) instruct serve\n\
to listen on one or more interfaces/ports, UNIX domain sockets, or Windows named pipes.\n\
\n\
For TCP ports on hostname \"localhost\":\n\n $ serve -l 1234\n\
\n\
For TCP (traditional host/port) endpoints:\n\n $ serve -l tcp://hostname:1234\n\
\n\
For UNIX domain socket endpoints:\n\n $ serve -l unix:/path/to/socket.sock\n\
\n\
For Windows named pipe endpoints:\n\n $ serve -l pipe:\\\\.\\pipe\\PipeName"
)]
pub struct CliArgs {
#[arg(short = 'h', long = "help", action = clap::ArgAction::SetTrue)]
pub help: bool,
#[arg(short = 'v', long = "version", action = clap::ArgAction::SetTrue)]
pub version: bool,
#[arg(short = 'l', long = "listen", value_name = "listen_uri")]
pub listen: Vec<String>,
#[arg(short = 'p', value_name = "port")]
pub port: Option<u16>,
#[arg(short = 's', long = "single", action = clap::ArgAction::SetTrue)]
pub single: bool,
#[arg(short = 'd', long = "debug", action = clap::ArgAction::SetTrue)]
pub debug: bool,
#[arg(short = 'c', long = "config", value_name = "path")]
pub config: Option<String>,
#[arg(short = 'L', long = "no-request-logging", action = clap::ArgAction::SetTrue)]
pub no_request_logging: bool,
#[arg(short = 'C', long = "cors", action = clap::ArgAction::SetTrue)]
pub cors: bool,
#[arg(short = 'n', long = "no-clipboard", action = clap::ArgAction::SetTrue)]
pub no_clipboard: bool,
#[arg(short = 'u', long = "no-compression", action = clap::ArgAction::SetTrue)]
pub no_compression: bool,
#[arg(long = "no-etag", action = clap::ArgAction::SetTrue)]
pub no_etag: bool,
#[arg(short = 'S', long = "symlinks", action = clap::ArgAction::SetTrue)]
pub symlinks: bool,
#[arg(long = "ssl-cert", value_name = "path")]
pub ssl_cert: Option<String>,
#[arg(long = "ssl-key", value_name = "path")]
pub ssl_key: Option<String>,
#[arg(long = "ssl-pass", value_name = "path")]
pub ssl_pass: Option<String>,
#[arg(long = "no-port-switching", action = clap::ArgAction::SetTrue)]
pub no_port_switching: bool,
#[arg(value_name = "directory", default_value = ".")]
pub directory: String,
}
pub fn parse_args() -> CliArgs {
CliArgs::parse()
}
pub fn print_help() {
println!(r#"serve - Static file serving and directory listing
USAGE
$ serve --help
$ serve --version
$ serve folder_name
$ serve [-l listen_uri [-l ...]] [directory]
By default, serve will listen on 0.0.0.0:3000 and serve the
current working directory on that address.
Specifying a single --listen argument will overwrite the default, not supplement it.
OPTIONS
--help Shows this help message
-v, --version Displays the current version of serve
-l, --listen listen_uri Specify a URI endpoint on which to listen (see below) -
more than one may be specified to listen in multiple places
-p Specify custom port
-s, --single Rewrite all not-found requests to `index.html`
-d, --debug Show debugging information
-c, --config Specify custom path to `serve.json`
-L, --no-request-logging Do not log any request information to the console.
-C, --cors Enable CORS, sets `Access-Control-Allow-Origin` to `*`
-n, --no-clipboard Do not copy the local address to the clipboard
-u, --no-compression Do not compress files
--no-etag Send `Last-Modified` header instead of `ETag`
-S, --symlinks Resolve symlinks instead of showing 404 errors
--ssl-cert Optional path to an SSL/TLS certificate to serve with HTTPS
Supported formats: PEM (default) and PKCS12 (PFX)
--ssl-key Optional path to the SSL/TLS certificate's private key
Applicable only for PEM certificates
--ssl-pass Optional path to the SSL/TLS certificate's passphrase
--no-port-switching Do not open a port other than the one specified when it's taken."#);
}