use clap::{Args, Parser, Subcommand, ValueEnum};
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum LayerArg {
System,
User,
Project,
}
#[derive(Debug, Parser)]
#[command(name = "yconn", version, about)]
pub struct Cli {
#[arg(long, global = true)]
pub all: bool,
#[arg(long, global = true)]
pub verbose: bool,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum InitLocation {
Yconn,
Dotfile,
Plain,
}
#[derive(Debug, Subcommand)]
pub enum ConnectionCommands {
Show {
#[arg(required_unless_present = "dump", conflicts_with = "dump")]
name: Option<String>,
#[arg(long, conflicts_with = "name")]
dump: bool,
},
Add {
#[arg(long, value_name = "LAYER")]
layer: Option<LayerArg>,
},
Edit {
name: String,
#[arg(long, value_name = "LAYER")]
layer: Option<LayerArg>,
},
Remove {
name: String,
#[arg(long, value_name = "LAYER")]
layer: Option<LayerArg>,
},
Init {
#[arg(long, value_enum, default_value = "yconn")]
location: InitLocation,
},
}
#[derive(Debug, Subcommand)]
pub enum Commands {
List {
#[arg(long, value_name = "NAME")]
group: Option<String>,
},
Connect {
name: String,
#[arg(long = "user", value_name = "KEY:VALUE", action = clap::ArgAction::Append)]
user_overrides: Vec<String>,
},
Connections {
#[command(subcommand)]
subcommand: ConnectionCommands,
},
Config,
Groups {
#[command(subcommand)]
subcommand: GroupCommands,
},
Install {
#[arg(long, value_name = "LAYER")]
layer: Option<LayerArg>,
},
SshConfig(SshConfigArgs),
Users {
#[command(subcommand)]
subcommand: UserCommands,
},
}
#[derive(Debug, Subcommand)]
pub enum UserCommands {
Show,
Add {
#[arg(long, value_name = "LAYER")]
layer: Option<LayerArg>,
#[arg(long = "user", value_name = "KEY:VALUE", action = clap::ArgAction::Append)]
user_pairs: Vec<String>,
},
Edit {
key: String,
#[arg(long, value_name = "LAYER")]
layer: Option<LayerArg>,
},
}
#[derive(Debug, Subcommand)]
pub enum GroupCommands {
List,
Use {
name: String,
},
Clear,
Current,
}
#[derive(Debug, Args)]
#[command(subcommand_required = true, arg_required_else_help = true)]
pub struct SshConfigArgs {
#[command(subcommand)]
pub subcommand: SshConfigCommands,
}
#[derive(Debug, Subcommand)]
pub enum SshConfigCommands {
Install {
#[arg(long)]
dry_run: bool,
#[arg(long = "user", value_name = "KEY:VALUE", action = clap::ArgAction::Append, conflicts_with = "skip_user")]
user_overrides: Vec<String>,
#[arg(long, conflicts_with = "user_overrides")]
skip_user: bool,
},
Print {
#[arg(long = "user", value_name = "KEY:VALUE", action = clap::ArgAction::Append, conflicts_with = "skip_user")]
user_overrides: Vec<String>,
#[arg(long, conflicts_with = "user_overrides")]
skip_user: bool,
},
Uninstall,
Disable,
Enable,
}