use std::path::PathBuf;
use anyhow::Result;
use clap::Subcommand;
use crate::commands;
#[derive(Debug, Subcommand)]
pub enum SkillsAction {
Add(AddArgs),
List(ScopeArgs),
Remove(RemoveArgs),
Find(FindArgs),
Init(InitArgs),
Update(UpdateArgs),
}
#[derive(Debug, clap::Args)]
pub struct AddArgs {
pub source: String,
#[arg(long = "skill", value_name = "NAME")]
pub skill: Option<String>,
#[arg(long, short = 'g')]
pub global: bool,
#[arg(long, short = 'y')]
pub yes: bool,
#[arg(long, value_name = "URL")]
pub registry: Option<String>,
#[arg(long, short = 'n', value_name = "NSID")]
pub namespace: Option<String>,
}
#[derive(Debug, clap::Args)]
pub struct ScopeArgs {
#[arg(long, short = 'g')]
pub global: bool,
}
#[derive(Debug, clap::Args)]
pub struct RemoveArgs {
pub name: String,
#[arg(long, short = 'g')]
pub global: bool,
}
#[derive(Debug, clap::Args)]
pub struct FindArgs {
pub query: String,
#[arg(long, value_name = "URL")]
pub registry: Option<String>,
#[arg(long, short = 'n', value_name = "NSID")]
pub namespace: Option<String>,
}
#[derive(Debug, clap::Args)]
pub struct InitArgs {
pub name: String,
#[arg(long, short = 'o', default_value = "SKILL.md")]
pub output: PathBuf,
}
#[derive(Debug, clap::Args)]
pub struct UpdateArgs {
pub name: Option<String>,
#[arg(long, short = 'g')]
pub global: bool,
#[arg(long, value_name = "URL")]
pub registry: Option<String>,
#[arg(long, short = 'n', value_name = "NSID")]
pub namespace: Option<String>,
}
pub async fn run(action: SkillsAction, output: &crate::output::Output) -> Result<()> {
match action {
SkillsAction::Add(args) => {
output.emit(
&commands::skills_add(
&args.source,
args.skill.as_deref(),
args.global,
args.yes,
args.registry.as_deref(),
args.namespace.as_deref(),
)
.await?,
)?;
Ok(())
}
SkillsAction::List(args) => {
output.emit(&commands::skills_list(args.global)?)?;
Ok(())
}
SkillsAction::Remove(args) => {
output.emit(&commands::skills_remove(&args.name, args.global)?)?;
Ok(())
}
SkillsAction::Find(args) => {
output.emit(
&commands::skills_find(
&args.query,
args.registry.as_deref(),
args.namespace.as_deref(),
)
.await?,
)?;
Ok(())
}
SkillsAction::Init(args) => {
output.emit(&commands::skills_init(&args.name, &args.output)?)?;
Ok(())
}
SkillsAction::Update(args) => {
let report = commands::skills_update(
args.name.as_deref(),
args.global,
args.registry.as_deref(),
args.namespace.as_deref(),
)
.await?;
output.emit(&report)?;
if !report.failed.is_empty() {
std::process::exit(1);
}
Ok(())
}
}
}