use clap::{ArgGroup, Args, Subcommand};
use std::path::PathBuf;
#[derive(Debug, Clone, Args)]
pub(crate) struct PluginsCommand {
#[command(subcommand)]
pub(crate) command: PluginsSubcommand,
}
impl PluginsCommand {
pub(crate) fn is_edit(&self) -> bool {
matches!(self.command, PluginsSubcommand::Edit(_))
}
}
#[derive(Debug, Clone, Copy)]
pub(crate) struct PluginJsonContext<'a> {
pub(crate) command: &'static str,
pub(crate) target: Option<&'a str>,
}
#[derive(Debug, Clone, Subcommand)]
pub(crate) enum PluginsSubcommand {
Edit(PluginsEditCommand),
Add(PluginsAddCommand),
Validate(PluginsValidateCommand),
List(PluginsListCommand),
Inspect(PluginsInspectCommand),
Enable(PluginsEnableCommand),
Disable(PluginsDisableCommand),
Remove(PluginsRemoveCommand),
}
impl PluginsSubcommand {
pub(crate) fn json_context(&self) -> Option<PluginJsonContext<'_>> {
match self {
Self::Validate(command) if command.json => Some(PluginJsonContext {
command: "plugins validate",
target: Some(command.target.as_str()),
}),
Self::List(command) if command.json => Some(PluginJsonContext {
command: "plugins list",
target: None,
}),
Self::Inspect(command) if command.json => Some(PluginJsonContext {
command: "plugins inspect",
target: Some(command.id.as_str()),
}),
_ => None,
}
}
}
#[derive(Debug, Clone, Default, Args)]
#[command(group(
ArgGroup::new("scope")
.args(["user", "project", "global"])
.multiple(false)
))]
pub(crate) struct PluginsScopeArgs {
#[arg(long)]
pub(crate) user: bool,
#[arg(long)]
pub(crate) project: bool,
#[arg(long)]
pub(crate) global: bool,
}
#[derive(Debug, Clone, Default, Args)]
pub(crate) struct PluginsEditCommand {
#[command(flatten)]
pub(crate) scope: PluginsScopeArgs,
}
#[derive(Debug, Clone, Default, Args)]
pub(crate) struct PluginsAddCommand {
#[command(flatten)]
pub(crate) scope: PluginsScopeArgs,
pub(crate) path: PathBuf,
}
#[derive(Debug, Clone, Args)]
pub(crate) struct PluginsValidateCommand {
pub(crate) target: String,
#[arg(long)]
pub(crate) json: bool,
}
#[derive(Debug, Clone, Default, Args)]
pub(crate) struct PluginsListCommand {
#[arg(long)]
pub(crate) all: bool,
#[arg(long)]
pub(crate) json: bool,
}
#[derive(Debug, Clone, Args)]
pub(crate) struct PluginsInspectCommand {
pub(crate) id: String,
#[arg(long)]
pub(crate) json: bool,
}
#[derive(Debug, Clone, Args)]
pub(crate) struct PluginsEnableCommand {
pub(crate) id: String,
}
#[derive(Debug, Clone, Args)]
pub(crate) struct PluginsDisableCommand {
pub(crate) id: String,
}
#[derive(Debug, Clone, Args)]
pub(crate) struct PluginsRemoveCommand {
pub(crate) id: String,
}
impl From<PluginsScopeArgs> for crate::plugins::ConfigurationScope {
fn from(value: PluginsScopeArgs) -> Self {
match (value.user, value.project, value.global) {
(false, false, false) => Self::Default,
(true, false, false) => Self::User,
(false, true, false) => Self::Project,
(false, false, true) => Self::Global,
_ => Self::Invalid,
}
}
}
impl PluginsEditCommand {
pub(crate) fn into_runtime(self) -> crate::plugins::PluginsEditRequest {
crate::plugins::PluginsEditRequest {
scope: self.scope.into(),
}
}
}
impl PluginsAddCommand {
pub(crate) fn into_runtime(self) -> crate::plugins::PluginsAddRequest {
crate::plugins::PluginsAddRequest {
scope: self.scope.into(),
path: self.path,
}
}
}
impl PluginsValidateCommand {
pub(crate) fn into_runtime(self) -> crate::plugins::PluginsValidateRequest {
crate::plugins::PluginsValidateRequest {
target: self.target,
json: self.json,
}
}
}
impl PluginsListCommand {
pub(crate) fn into_runtime(self) -> crate::plugins::PluginsListRequest {
crate::plugins::PluginsListRequest {
all: self.all,
json: self.json,
}
}
}
impl PluginsInspectCommand {
pub(crate) fn into_runtime(self) -> crate::plugins::PluginsInspectRequest {
crate::plugins::PluginsInspectRequest {
id: self.id,
json: self.json,
}
}
}
impl PluginsEnableCommand {
pub(crate) fn into_runtime(self) -> crate::plugins::PluginsEnableRequest {
crate::plugins::PluginsEnableRequest { id: self.id }
}
}
impl PluginsDisableCommand {
pub(crate) fn into_runtime(self) -> crate::plugins::PluginsDisableRequest {
crate::plugins::PluginsDisableRequest { id: self.id }
}
}
impl PluginsRemoveCommand {
pub(crate) fn into_runtime(self) -> crate::plugins::PluginsRemoveRequest {
crate::plugins::PluginsRemoveRequest { id: self.id }
}
}