use std::path::PathBuf; use clap::Parser; #[cfg(feature = "oauth-discord")] use secrecy::SecretString; use serde::Deserialize; 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, /// Server's domain #[arg(short, long, default_value = "localhost", env = "DOMAIN")] pub domain: Option, /// Sets a custom config file #[arg(short, long, value_name = "FILE")] pub config: Option, /// Sets the application log level #[arg(short, long, value_enum, env = "LOG_LEVEL", default_value = "debug")] pub log_level: Option, /// Request timeout duration (in seconds) #[arg(short, long, env = "TIMEOUT_SECONDS", default_value = "10")] pub timeout_duration: Option, /// Users database connection string #[arg( long, env = "USERS_DATABASE_URL", default_value = "postgres://postgres:password@localhost:5432/sellershut" )] pub db: Option, /// Server's system name #[arg(short, long, default_value = "sellershut", env = "SYSTEM_NAME")] pub system_name: Option, /// Server's system name #[arg(short, long, default_value = "prod", env = "SYSTEM_NAME")] pub environment: Option, /// Oauth optionas #[command(flatten)] #[cfg(feature = "oauth")] pub oauth: OAuth, } #[derive(Debug, Clone, Parser, Deserialize)] pub struct OAuth { #[cfg(feature = "oauth-discord")] #[command(flatten)] discord: DiscordOauth, #[arg(long, env = "OAUTH_REDIRECT_URL")] oauth_redirect_url: Option, } #[cfg(feature = "oauth-discord")] #[derive(Debug, Clone, Parser, Deserialize, Default)] pub struct DiscordOauth { #[arg(long, env = "OAUTH_DISCORD_CLIENT_ID")] discord_client_id: Option, #[arg(long, env = "OAUTH_DISCORD_CLIENT_SECRET")] discord_client_secret: Option, #[arg( long, env = "OAUTH_DISCORD_TOKEN_URL", default_value = "https://discord.com/api/oauth2/token" )] discord_token_url: Option, #[arg( long, env = "OAUTH_DISCORD_AUTH_URL", default_value = "https://discord.com/api/oauth2/authorize?response_type=code" )] discord_auth_url: Option, } #[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: None, db: url, } } } #[cfg(test)] mod tests { use super::*; #[test] fn verify_cli() { use clap::CommandFactory; Cli::command().debug_assert(); } }