mangadex-home-rs/src/config.rs

105 lines
3.9 KiB
Rust
Raw Normal View History

2021-04-25 16:55:31 +00:00
use std::{fmt::Display, path::PathBuf};
use std::{fmt::Formatter, sync::atomic::AtomicBool};
use std::{
num::{NonZeroU16, NonZeroU64},
str::FromStr,
};
2021-03-26 01:06:54 +00:00
2021-04-18 02:13:36 +00:00
use clap::{crate_authors, crate_description, crate_version, Clap};
2021-04-19 03:06:18 +00:00
use url::Url;
2021-03-26 01:06:54 +00:00
2021-03-26 02:58:07 +00:00
// Validate tokens is an atomic because it's faster than locking on rwlock.
pub static VALIDATE_TOKENS: AtomicBool = AtomicBool::new(false);
// We use an atomic here because it's better for us to not pass the config
// everywhere.
pub static SEND_SERVER_VERSION: AtomicBool = AtomicBool::new(false);
2021-03-26 04:07:32 +00:00
#[derive(Clap, Clone)]
2021-04-18 02:13:36 +00:00
#[clap(version = crate_version!(), author = crate_authors!(), about = crate_description!())]
2021-03-26 01:06:54 +00:00
pub struct CliArgs {
/// The port to listen on.
#[clap(short, long, default_value = "42069", env = "PORT")]
pub port: NonZeroU16,
/// How large, in bytes, the in-memory cache should be. Note that this does
/// not include runtime memory usage.
#[clap(long, env = "MEM_CACHE_QUOTA_BYTES")]
2021-04-15 02:52:54 +00:00
pub memory_quota: NonZeroU64,
2021-03-26 01:06:54 +00:00
/// How large, in bytes, the on-disk cache should be. Note that actual
/// values may be larger for metadata information.
#[clap(long, env = "DISK_CACHE_QUOTA_BYTES")]
2021-04-15 02:52:54 +00:00
pub disk_quota: u64,
2021-03-26 01:06:54 +00:00
/// Sets the location of the disk cache.
#[clap(long, default_value = "./cache", env = "DISK_CACHE_PATH")]
pub cache_path: PathBuf,
/// The network speed to advertise to Mangadex@Home control server.
#[clap(long, env = "MAX_NETWORK_SPEED")]
2021-04-15 02:52:54 +00:00
pub network_speed: NonZeroU64,
2021-03-26 01:06:54 +00:00
/// Whether or not to provide the Server HTTP header to clients. This is
/// useful for debugging, but is generally not recommended for security
/// reasons.
2021-03-26 02:58:07 +00:00
#[clap(long, env = "ENABLE_SERVER_STRING", takes_value = false)]
2021-03-26 01:06:54 +00:00
pub enable_server_string: bool,
2021-04-25 03:56:56 +00:00
/// Changes the caching behavior to avoid buffering images in memory, and
/// instead use the filesystem as the buffer backing. This is useful for
/// clients in low (< 1GB) RAM environments.
2021-04-18 21:38:33 +00:00
#[clap(
short,
long,
conflicts_with("memory-quota"),
env = "LOW_MEMORY_MODE",
takes_value = false
)]
2021-04-15 02:11:00 +00:00
pub low_memory: bool,
2021-04-20 18:12:20 +00:00
/// Changes verbosity. Default verbosity is INFO, while increasing counts of
/// verbose flags increases the verbosity to DEBUG and TRACE, respectively.
2021-04-18 03:19:27 +00:00
#[clap(short, long, parse(from_occurrences))]
pub verbose: usize,
2021-04-20 18:12:20 +00:00
/// Changes verbosity. Default verbosity is INFO, while increasing counts of
/// quiet flags decreases the verbosity to WARN, ERROR, and no logs,
/// respectively.
#[clap(short, long, parse(from_occurrences), conflicts_with = "verbose")]
pub quiet: usize,
2021-04-25 16:55:31 +00:00
#[clap(short = 'Z', long)]
pub unstable_options: Vec<UnstableOptions>,
2021-04-19 03:06:18 +00:00
#[clap(long)]
pub override_upstream: Option<Url>,
2021-04-25 16:55:31 +00:00
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum UnstableOptions {
/// Overrides the upstream URL to fetch images from. Don't use this unless
/// you know what you're dealing with.
OverrideUpstream,
2021-04-25 03:56:56 +00:00
/// Use an LFU implementation for the in-memory cache instead of the default
/// LRU implementation.
2021-04-25 16:55:31 +00:00
UseLfu,
/// Disables token validation. Don't use this unless you know the
/// ramifications of this command.
DisableTokenValidation,
}
impl FromStr for UnstableOptions {
type Err = &'static str;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"override-upstream" => Ok(Self::OverrideUpstream),
"use-lfu" => Ok(Self::UseLfu),
"disable-token-validation" => Ok(Self::DisableTokenValidation),
_ => Err("Unknown unstable option"),
}
}
}
impl Display for UnstableOptions {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::OverrideUpstream => write!(f, "override-upstream"),
Self::UseLfu => write!(f, "use-lfu"),
Self::DisableTokenValidation => write!(f, "disable-token-validation"),
}
}
2021-03-26 01:06:54 +00:00
}