use clap::{Parser, Subcommand};
pub const DEFAULT_CDP_HOST: &str = "127.0.0.1:9222";
#[derive(Parser)]
#[command(name = "tfd", about = "tail-fin daemon & client", version)]
pub struct Cli {
#[arg(
long,
default_value = "~/.tail-fin/daemon.sock",
env = "TFD_SOCKET",
global = true
)]
pub socket: String,
#[arg(
long,
default_value = DEFAULT_CDP_HOST,
env = "TFD_HOST",
global = true
)]
pub host: String,
#[arg(long, env = "TFD_SESSION", global = true)]
pub session: Option<String>,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
Daemon {
#[command(subcommand)]
cmd: DaemonCmd,
},
Session {
#[command(subcommand)]
cmd: SessionCmd,
},
Sa {
#[command(subcommand)]
cmd: crate::dispatch::sa::SaCmd,
},
Twitter {
#[command(subcommand)]
cmd: crate::dispatch::twitter::TwitterCmd,
},
Grok {
#[command(subcommand)]
cmd: crate::dispatch::grok::GrokCmd,
},
#[command(hide = true)]
Start {
#[arg(long, default_value_t = 300)]
idle_timeout: u64,
#[arg(long, default_value_t = 900)]
daemon_idle: u64,
#[arg(long, default_value_t = 3)]
max_sessions: usize,
#[arg(long, default_value_t = false)]
detach: bool,
},
}
#[derive(Subcommand)]
pub enum DaemonCmd {
Start {
#[arg(long, default_value_t = 300)]
idle_timeout: u64,
#[arg(long, default_value_t = 900)]
daemon_idle: u64,
#[arg(long, default_value_t = 3)]
max_sessions: usize,
},
Stop,
Status,
}
#[derive(Subcommand)]
pub enum SessionCmd {
Acquire {
#[arg(long)]
site: String,
#[arg(long, default_value = DEFAULT_CDP_HOST)]
host: String,
},
Release { session_id: String },
List,
Destroy { session_id: String },
}
pub fn expand_home(path: &str) -> String {
if let Some(rest) = path.strip_prefix("~/") {
if let Ok(home) = std::env::var("HOME") {
return format!("{home}/{rest}");
}
}
path.to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn expand_home_replaces_tilde() {
std::env::set_var("HOME", "/tmp/fakehome");
assert_eq!(expand_home("~/foo"), "/tmp/fakehome/foo");
}
#[test]
fn expand_home_leaves_absolute_path() {
assert_eq!(expand_home("/var/run/x.sock"), "/var/run/x.sock");
}
}