use clap::Parser;
#[cfg(feature = "tcp_server")]
use kanata_state_machine::SocketAddrWrapper;
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(author, version, verbatim_doc_comment)]
pub struct Args {
#[cfg_attr(
target_os = "windows",
doc = r"Configuration file(s) to use with kanata. If not specified, defaults to
kanata.kbd in the current working directory and
'C:\Users\user\AppData\Roaming\kanata\kanata.kbd'."
)]
#[cfg_attr(
target_os = "macos",
doc = "Configuration file(s) to use with kanata. If not specified, defaults to
kanata.kbd in the current working directory and
'$HOME/Library/Application Support/kanata/kanata.kbd'."
)]
#[cfg_attr(
not(any(target_os = "macos", target_os = "windows")),
doc = "Configuration file(s) to use with kanata. If not specified, defaults to
kanata.kbd in the current working directory and
'$XDG_CONFIG_HOME/kanata/kanata.kbd'."
)]
#[arg(short, long, verbatim_doc_comment)]
pub cfg: Option<Vec<PathBuf>>,
#[arg(long, verbatim_doc_comment)]
pub cfg_stdin: bool,
#[cfg(feature = "tcp_server")]
#[arg(
short = 'p',
long = "port",
value_name = "PORT or IP:PORT",
verbatim_doc_comment
)]
pub tcp_server_address: Option<SocketAddrWrapper>,
#[cfg(any(target_os = "linux", target_os = "android"))]
#[arg(short, long, verbatim_doc_comment)]
pub symlink_path: Option<String>,
#[cfg(any(
target_os = "macos",
any(target_os = "linux", target_os = "android"),
all(
target_os = "windows",
feature = "interception_driver",
not(feature = "gui")
)
))]
#[arg(short, long)]
pub list: bool,
#[arg(short, long)]
pub quiet: bool,
#[arg(short, long)]
pub debug: bool,
#[arg(short, long)]
pub trace: bool,
#[arg(short, long, verbatim_doc_comment)]
pub nodelay: bool,
#[cfg(any(target_os = "linux", target_os = "android"))]
#[arg(short, long, verbatim_doc_comment)]
pub wait_device_ms: Option<u64>,
#[arg(long, verbatim_doc_comment)]
pub check: bool,
#[arg(long, verbatim_doc_comment)]
pub log_layer_changes: bool,
#[arg(long, verbatim_doc_comment)]
pub no_wait: bool,
#[arg(long, default_value = "0", verbatim_doc_comment)]
pub emergency_exit_code: i32,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn no_wait_flag_default_false() {
let args = Args::try_parse_from(["kanata"]).unwrap();
assert!(!args.no_wait);
}
#[test]
fn no_wait_flag_enabled() {
let args = Args::try_parse_from(["kanata", "--no-wait"]).unwrap();
assert!(args.no_wait);
}
#[test]
fn no_wait_with_other_flags() {
let args =
Args::try_parse_from(["kanata", "--no-wait", "--nodelay", "-c", "test.kbd"]).unwrap();
assert!(args.no_wait);
assert!(args.nodelay);
}
#[test]
fn emergency_exit_code_default() {
let args = Args::try_parse_from(["kanata"]).unwrap();
assert_eq!(args.emergency_exit_code, 0);
}
#[test]
fn emergency_exit_code_custom() {
let args = Args::try_parse_from(["kanata", "--emergency-exit-code", "42"]).unwrap();
assert_eq!(args.emergency_exit_code, 42);
}
#[test]
fn emergency_exit_code_with_other_flags() {
let args = Args::try_parse_from([
"kanata",
"--emergency-exit-code",
"1",
"--no-wait",
"-c",
"test.kbd",
])
.unwrap();
assert_eq!(args.emergency_exit_code, 1);
assert!(args.no_wait);
}
}