mod auth;
mod discovery;
mod install;
mod publish;
use anyhow::Result;
use clap::{Args, Subcommand};
use crate::output::OutputFormat;
#[derive(Debug, Subcommand)]
pub enum MarketplaceCommands {
Search(SearchArgs),
Install(InstallArgs),
Uninstall(UninstallArgs),
Update(UpdateArgs),
Login,
Logout,
Status,
License(LicenseArgs),
Init(InitArgs),
Package(PackageArgs),
Publish(PublishArgs),
Review(ReviewArgs),
ClearCache,
}
#[derive(Debug, Args)]
pub struct SearchArgs {
#[arg(default_value = "")]
pub query: String,
#[arg(short, long)]
pub tier: Option<String>,
#[arg(short, long)]
pub category: Option<String>,
#[arg(short, long, default_value = "name")]
pub sort: String,
}
#[derive(Debug, Args)]
pub struct InstallArgs {
pub name: String,
#[arg(short, long)]
pub version: Option<String>,
}
#[derive(Debug, Args)]
pub struct UninstallArgs {
pub name: String,
}
#[derive(Debug, Args)]
pub struct UpdateArgs {
pub name: Option<String>,
#[arg(long)]
pub check: bool,
#[arg(long)]
pub all: bool,
}
#[derive(Debug, Args)]
pub struct LicenseArgs {
pub key: String,
}
#[derive(Debug, Args)]
pub struct InitArgs {
#[arg(short, long)]
pub name: Option<String>,
#[arg(short, long)]
pub author: Option<String>,
#[arg(default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct PackageArgs {
#[arg(default_value = ".")]
pub dir: String,
}
#[derive(Debug, Args)]
pub struct PublishArgs {
#[arg(default_value = ".")]
pub path: String,
#[arg(long)]
pub status: Option<String>,
}
#[derive(Debug, Args)]
pub struct ReviewArgs {
pub name: String,
#[arg(short, long)]
pub rating: Option<u8>,
#[arg(short, long)]
pub comment: Option<String>,
}
impl MarketplaceCommands {
pub async fn execute(self, output_format: OutputFormat) -> Result<()> {
match self {
MarketplaceCommands::Search(args) => discovery::search(args, output_format).await,
MarketplaceCommands::Install(args) => install::install(args, output_format).await,
MarketplaceCommands::Uninstall(args) => install::uninstall(args, output_format).await,
MarketplaceCommands::Update(args) => install::update(args, output_format).await,
MarketplaceCommands::Login => auth::login(output_format).await,
MarketplaceCommands::Logout => auth::logout(output_format).await,
MarketplaceCommands::Status => auth::status(output_format).await,
MarketplaceCommands::License(args) => auth::license(args, output_format).await,
MarketplaceCommands::Init(args) => publish::init(args, output_format).await,
MarketplaceCommands::Package(args) => publish::package(args, output_format).await,
MarketplaceCommands::Publish(args) => publish::publish(args, output_format).await,
MarketplaceCommands::Review(args) => publish::review(args, output_format).await,
MarketplaceCommands::ClearCache => discovery::clear_cache(output_format).await,
}
}
}
fn truncate_str(s: &str, max_len: usize) -> String {
if s.len() <= max_len {
s.to_string()
} else {
format!("{}...", &s[..max_len - 3])
}
}
fn format_status(status: &str) -> String {
use colored::Colorize;
match status {
"pending" => "Pending".yellow().to_string(),
"reviewing" => "Under Review".cyan().to_string(),
"approved" => "Approved".green().to_string(),
"rejected" => "Rejected".red().to_string(),
_ => status.to_string(),
}
}