use std::path::PathBuf;
use structopt::StructOpt;
use crate::directory_listing::DirListFmt;
#[derive(Debug, StructOpt)]
#[structopt(about, author)]
pub struct General {
#[structopt(long, short = "a", default_value = "::", env = "SERVER_HOST")]
pub host: String,
#[structopt(long, short = "p", default_value = "80", env = "SERVER_PORT")]
pub port: u16,
#[structopt(
long,
short = "f",
env = "SERVER_LISTEN_FD",
conflicts_with_all(&["host", "port"])
)]
pub fd: Option<usize>,
#[cfg_attr(
not(wasm),
structopt(
long,
short = "n",
default_value = "1",
env = "SERVER_THREADS_MULTIPLIER"
)
)]
#[cfg_attr(
wasm,
structopt(
long,
short = "n",
default_value = "2",
env = "SERVER_THREADS_MULTIPLIER"
)
)]
pub threads_multiplier: usize,
#[cfg_attr(
not(wasm),
structopt(
long,
short = "b",
default_value = "512",
env = "SERVER_MAX_BLOCKING_THREADS"
)
)]
#[cfg_attr(
wasm,
structopt(
long,
short = "b",
default_value = "20",
env = "SERVER_MAX_BLOCKING_THREADS"
)
)]
pub max_blocking_threads: usize,
#[structopt(long, short = "d", default_value = "./public", env = "SERVER_ROOT")]
pub root: PathBuf,
#[structopt(
long,
default_value = "./public/50x.html",
env = "SERVER_ERROR_PAGE_50X"
)]
pub page50x: PathBuf,
#[structopt(
long,
default_value = "./public/404.html",
env = "SERVER_ERROR_PAGE_404"
)]
pub page404: PathBuf,
#[structopt(long, env = "SERVER_FALLBACK_PAGE")]
pub page_fallback: Option<PathBuf>,
#[structopt(long, short = "g", default_value = "error", env = "SERVER_LOG_LEVEL")]
pub log_level: String,
#[structopt(
long,
short = "c",
default_value = "",
env = "SERVER_CORS_ALLOW_ORIGINS"
)]
pub cors_allow_origins: String,
#[structopt(
long,
short = "j",
default_value = "origin, content-type",
env = "SERVER_CORS_ALLOW_HEADERS"
)]
pub cors_allow_headers: String,
#[structopt(
long,
default_value = "origin, content-type",
env = "SERVER_CORS_EXPOSE_HEADERS"
)]
pub cors_expose_headers: String,
#[structopt(
long,
short = "t",
parse(try_from_str),
default_value = "false",
env = "SERVER_HTTP2_TLS"
)]
#[cfg(feature = "http2")]
pub http2: bool,
#[structopt(long, required_if("http2", "true"), env = "SERVER_HTTP2_TLS_CERT")]
#[cfg(feature = "http2")]
pub http2_tls_cert: Option<PathBuf>,
#[structopt(long, required_if("http2", "true"), env = "SERVER_HTTP2_TLS_KEY")]
#[cfg(feature = "http2")]
pub http2_tls_key: Option<PathBuf>,
#[structopt(
long,
short = "x",
parse(try_from_str),
default_value = "true",
env = "SERVER_COMPRESSION"
)]
pub compression: bool,
#[structopt(
long,
parse(try_from_str),
default_value = "false",
env = "SERVER_COMPRESSION_STATIC"
)]
pub compression_static: bool,
#[structopt(
long,
short = "z",
parse(try_from_str),
default_value = "false",
env = "SERVER_DIRECTORY_LISTING"
)]
pub directory_listing: bool,
#[structopt(
long,
required_if("directory_listing", "true"),
default_value = "6",
env = "SERVER_DIRECTORY_LISTING_ORDER"
)]
pub directory_listing_order: u8,
#[structopt(
long,
required_if("directory_listing", "true"),
possible_values = &DirListFmt::variants(),
default_value = "html",
env = "SERVER_DIRECTORY_LISTING_FORMAT",
case_insensitive = true
)]
pub directory_listing_format: DirListFmt,
#[structopt(
long,
parse(try_from_str),
required_if("http2", "true"),
default_value_if("http2", Some("true"), "true"),
default_value = "false",
env = "SERVER_SECURITY_HEADERS"
)]
pub security_headers: bool,
#[structopt(
long,
short = "e",
parse(try_from_str),
default_value = "true",
env = "SERVER_CACHE_CONTROL_HEADERS"
)]
pub cache_control_headers: bool,
#[structopt(long, default_value = "", env = "SERVER_BASIC_AUTH")]
pub basic_auth: String,
#[structopt(long, short = "q", default_value = "0", env = "SERVER_GRACE_PERIOD")]
pub grace_period: u8,
#[structopt(long, short = "w", env = "SERVER_CONFIG_FILE")]
pub config_file: Option<PathBuf>,
#[structopt(
long,
parse(try_from_str),
default_value = "false",
env = "SERVER_LOG_REMOTE_ADDRESS"
)]
pub log_remote_address: bool,
#[structopt(
long,
parse(try_from_str),
default_value = "true",
env = "SERVER_REDIRECT_TRAILING_SLASH"
)]
pub redirect_trailing_slash: bool,
#[structopt(
long,
parse(try_from_str),
default_value = "false",
env = "SERVER_IGNORE_HIDDEN_FILES"
)]
pub ignore_hidden_files: bool,
#[cfg(windows)]
#[structopt(
long,
short = "s",
parse(try_from_str),
default_value = "false",
env = "SERVER_WINDOWS_SERVICE"
)]
pub windows_service: bool,
#[cfg(windows)]
#[structopt(subcommand)]
pub commands: Option<Commands>,
}
#[cfg(windows)]
#[derive(Debug, StructOpt)]
pub enum Commands {
#[structopt(name = "install")]
Install {},
#[structopt(name = "uninstall")]
Uninstall {},
}