use crate::BoxError;
use asimov_module::ModuleName;
use clientele::{StandardOptions, SysexitsError::*, crates::clap::Subcommand};
use color_print::ceprintln;
use std::{string::String, vec::Vec};
#[derive(Debug, Subcommand)]
pub enum ModuleCommand {
#[clap(alias = "open")]
Browse {
name: ModuleName,
},
#[clap(args_conflicts_with_subcommands = true)]
Config {
#[clap(subcommand)]
command: Option<ConfigCommand>,
name: Option<ModuleName>,
},
Disable {
names: Vec<ModuleName>,
},
#[clap(alias = "readme")]
Doc {
name: ModuleName,
},
Enable {
names: Vec<ModuleName>,
},
#[cfg(feature = "unstable")]
#[clap(alias = "which")]
Find {
name: ModuleName,
},
#[clap(alias = "show")]
Inspect {
name: ModuleName,
#[arg(value_name = "FORMAT", short = 'o', long)]
output: Option<String>,
},
Install {
names: Vec<ModuleName>,
#[arg(long)]
version: Option<String>,
#[arg(long)]
model_size: Option<String>,
},
#[clap(alias = "url")]
Link {
name: ModuleName,
},
#[clap(alias = "ls")]
List {
#[arg(value_name = "FORMAT", short = 'o', long)]
output: Option<String>,
},
Resolve {
url: String,
},
Search {
#[clap(required = true)]
query: Vec<String>,
#[arg(value_name = "FORMAT", short = 'o', long)]
output: Option<String>,
},
Uninstall {
names: Vec<ModuleName>,
},
#[clap(alias = "update")]
Upgrade {
names: Vec<ModuleName>,
#[arg(long)]
version: Option<String>,
#[arg(long)]
model_size: Option<String>,
},
}
impl ModuleCommand {
pub async fn run(self, flags: &StandardOptions) -> Result<(), BoxError> {
use ModuleCommand::*;
match self {
Browse { name } => browse(name, flags).await,
Config { command, name } => match (command, name) {
(Some(command), _) => command.run(flags).await,
(None, Some(name)) => {
ConfigCommand::Show {
name: name.clone(),
output: None,
}
.run(flags)
.await
},
(None, None) => {
ceprintln!("<s,r>error:</> missing module name or subcommand");
ceprintln!(
"<s,dim>hint:</> See the available subcommands with: <s>asimov module config --help</>"
);
Err(EX_USAGE.into())
},
},
Disable { names } => disable(names, flags).await,
Doc { name } => doc(name, flags).await,
Enable { names } => enable(names, flags).await,
#[cfg(feature = "unstable")]
Find { name } => find(name, flags).await,
Inspect { name, output } => {
inspect(name, output.as_deref().unwrap_or("cli").into(), flags).await
},
Install {
names,
version,
model_size,
} => install(names, version, model_size, flags).await,
Link { name } => link(name, flags).await,
List { output } => list(output.as_deref().unwrap_or("cli").into(), flags).await,
Resolve { url } => resolve(url, flags).await,
Search { query, output } => {
search(query, output.as_deref().unwrap_or("cli").into(), flags).await
},
Uninstall { names } => uninstall(names, flags).await,
Upgrade {
names,
version,
model_size,
} => upgrade(names, version, model_size, flags).await,
}
}
}
mod browse;
pub use browse::*;
mod config;
pub use config::*;
mod disable;
pub use disable::*;
mod doc;
pub use doc::*;
mod enable;
pub use enable::*;
mod find;
pub use find::*;
mod inspect;
pub use inspect::*;
mod install;
pub use install::*;
mod link;
pub use link::*;
mod list;
pub use list::*;
mod resolve;
pub use resolve::*;
mod search;
pub use search::*;
mod uninstall;
pub use uninstall::*;
mod upgrade;
pub use upgrade::*;