use std::path::PathBuf;
use anyhow::bail;
use clap::{arg, ArgAction, Args};
use super::Compression;
#[derive(Debug, Args)]
#[command(flatten_help = true)]
#[cfg(feature = "ssh")]
pub struct SendSshArgs {
#[arg(required(true),
value_hint = clap::ValueHint::AnyPath)]
pub sources: Vec<String>,
#[arg(required(true))]
pub destination: String,
#[arg(long)]
pub tcp_port: Option<u16>,
#[arg(long, default_value_t = 5000)]
pub mdns_resolve_timeout_ms: u64,
#[arg(long, default_value_t = 10000)]
pub ssh_timeout_ms: u64,
#[cfg(feature = "mdns")]
#[arg(long, default_value_t = crate::config::misc::IpVersion::V4)]
pub ip_version: crate::config::misc::IpVersion,
#[arg(short('p'), long, default_value_t = 22)]
pub ssh_port: u16,
#[command(subcommand)]
pub compression: Option<Compression>,
#[arg(long, env(crate::ssh::ENV_SSH_PRIVATE_KEY))]
pub ssh_private_key_path: Option<PathBuf>,
#[arg(long, env(crate::ssh::ENV_SSH_KEY_DIR))]
pub ssh_key_dir: Option<PathBuf>,
#[arg(short, long, default_value_t = 49152)]
pub start_port: u16,
#[arg(short, long, requires("start_port"), default_value_t = u16::MAX)]
pub end_port: u16,
#[arg(long, action = ArgAction::SetTrue, global(true))]
pub mmap: bool,
}
#[derive(Debug, Clone)]
pub struct TargetComponents {
pub user: String,
pub host: String,
pub destination: PathBuf,
}
pub fn parse_scp_style_uri(input: &str) -> anyhow::Result<TargetComponents> {
let parts: Vec<&str> = input.split('@').collect();
if parts.len() != 2 {
bail!("Invalid SSH argument format: {input}")
}
let user = parts[0].to_string();
let host_and_dest: Vec<&str> = parts[1].split(':').collect();
if host_and_dest.len() != 2 {
bail!("Invalid SSH argument format: {input}")
}
let host = host_and_dest[0].to_string();
let destination = PathBuf::from(host_and_dest[1]);
Ok(TargetComponents {
user,
host,
destination,
})
}
impl SendSshArgs {
pub fn is_sending(&self) -> bool {
self.destination.contains('@')
}
}