aboutsummaryrefslogtreecommitdiffstats
path: root/src/config/cli/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config/cli/mod.rs')
-rw-r--r--src/config/cli/mod.rs89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/config/cli/mod.rs b/src/config/cli/mod.rs
new file mode 100644
index 0000000..81eb2fe
--- /dev/null
+++ b/src/config/cli/mod.rs
@@ -0,0 +1,89 @@
+pub mod cache;
+
+#[cfg(feature = "oauth")]
+pub mod oauth;
+
+use std::path::PathBuf;
+
+use clap::Parser;
+use url::Url;
+
+use crate::config::{logging::LogLevel, port::port_in_range};
+
+#[derive(Parser, Debug)]
+#[command(version, about, long_about = None, name = env!("CARGO_PKG_NAME"))]
+pub struct Cli {
+ /// Sets the port the server listens on
+ #[arg(short, long, default_value = "2210", env = "PORT", value_parser = port_in_range)]
+ pub port: Option<u16>,
+
+ /// Server's domain
+ #[arg(short, long, default_value = "localhost", env = "DOMAIN")]
+ pub domain: Option<String>,
+
+ /// Sets a custom config file
+ #[arg(short, long, value_name = "FILE")]
+ pub config: Option<PathBuf>,
+
+ /// Sets the application log level
+ #[arg(short, long, value_enum, env = "LOG_LEVEL", default_value = "debug")]
+ pub log_level: Option<LogLevel>,
+
+ /// Request timeout duration (in seconds)
+ #[arg(short, long, env = "TIMEOUT_SECONDS", default_value = "10")]
+ pub timeout_duration: Option<u64>,
+
+ /// Database connection string
+ #[arg(
+ long,
+ env = "DATABASE_URL",
+ default_value = "postgres://postgres:password@localhost:5432/sellershut"
+ )]
+ pub db: Option<Url>,
+
+ #[command(flatten)]
+ pub cache: Option<cache::Cache>,
+
+ /// Server's system name
+ #[arg(short, long, default_value = "sellershut", env = "SYSTEM_NAME")]
+ pub system_name: Option<String>,
+
+ /// Server's system name
+ #[arg(short, long, default_value = "prod", env = "SYSTEM_NAME")]
+ pub environment: Option<String>,
+
+ /// Oauth optionas
+ #[command(flatten)]
+ #[cfg(feature = "oauth")]
+ pub oauth: oauth::OAuth,
+}
+
+#[cfg(test)]
+impl Default for Cli {
+ fn default() -> Self {
+ let url = Url::parse("postgres://postgres:password@localhost:5432/sellershut").ok();
+ Self {
+ port: Default::default(),
+ config: Default::default(),
+ log_level: Default::default(),
+ timeout_duration: Some(10),
+ domain: Default::default(),
+ system_name: Default::default(),
+ environment: Default::default(),
+ oauth: Default::default(),
+ cache: Default::default(),
+ db: url,
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn verify_cli() {
+ use clap::CommandFactory;
+ Cli::command().debug_assert();
+ }
+}