use clap::Parser;
use std::path::PathBuf;
#[derive(Debug, Clone, Parser)]
#[command(name = "rusmes-server", version, about, long_about = None)]
pub struct Cli {
#[arg(short = 'c', long = "config", value_name = "PATH")]
pub config: Option<PathBuf>,
#[arg(long = "check-config", default_value_t = false)]
pub check_config: bool,
#[arg(value_name = "CONFIG")]
pub positional_config: Option<PathBuf>,
}
impl Cli {
pub fn resolve_config_path(&self) -> (PathBuf, bool) {
if let Some(ref path) = self.config {
return (path.clone(), false);
}
if let Some(ref path) = self.positional_config {
return (path.clone(), true);
}
(PathBuf::from("rusmes.toml"), false)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resolves_explicit_config_flag() {
let cli = Cli::parse_from(["rusmes-server", "-c", "/etc/rusmes/rusmes.toml"]);
let (path, fallback) = cli.resolve_config_path();
assert_eq!(path, PathBuf::from("/etc/rusmes/rusmes.toml"));
assert!(!fallback);
assert!(!cli.check_config);
}
#[test]
fn resolves_long_form_config_flag() {
let cli = Cli::parse_from(["rusmes-server", "--config", "x.toml"]);
let (path, fallback) = cli.resolve_config_path();
assert_eq!(path, PathBuf::from("x.toml"));
assert!(!fallback);
}
#[test]
fn resolves_positional_fallback_with_deprecation_flag() {
let cli = Cli::parse_from(["rusmes-server", "rusmes.toml"]);
let (path, fallback) = cli.resolve_config_path();
assert_eq!(path, PathBuf::from("rusmes.toml"));
assert!(fallback);
}
#[test]
fn flag_takes_precedence_over_positional() {
let cli = Cli::parse_from(["rusmes-server", "-c", "flag.toml", "positional.toml"]);
let (path, fallback) = cli.resolve_config_path();
assert_eq!(path, PathBuf::from("flag.toml"));
assert!(!fallback);
}
#[test]
fn resolves_default_when_nothing_supplied() {
let cli = Cli::parse_from(["rusmes-server"]);
let (path, fallback) = cli.resolve_config_path();
assert_eq!(path, PathBuf::from("rusmes.toml"));
assert!(!fallback);
}
#[test]
fn check_config_flag_parses() {
let cli = Cli::parse_from(["rusmes-server", "--check-config", "-c", "x.toml"]);
assert!(cli.check_config);
}
}