1use crate::BoxError;
4use asimov_module::ModuleName;
5use clientele::{StandardOptions, SysexitsError::*, crates::clap::Subcommand};
6use color_print::ceprintln;
7use std::{string::String, vec::Vec};
8
9#[derive(Debug, Subcommand)]
10pub enum ModuleCommand {
11 #[clap(alias = "open")]
13 Browse {
14 name: ModuleName,
16 },
17
18 #[clap(args_conflicts_with_subcommands = true)]
20 Config {
21 #[clap(subcommand)]
22 command: Option<ConfigCommand>,
23
24 name: Option<ModuleName>,
26 },
27
28 Disable {
30 names: Vec<ModuleName>,
32 },
33
34 #[clap(alias = "readme")]
36 Doc {
37 name: ModuleName,
39 },
40
41 Enable {
43 names: Vec<ModuleName>,
45 },
46
47 #[cfg(feature = "unstable")]
49 #[clap(alias = "which")]
50 Find {
51 name: ModuleName,
53 },
54
55 #[clap(alias = "show")]
57 Inspect {
58 name: ModuleName,
60
61 #[arg(value_name = "FORMAT", short = 'o', long)]
63 output: Option<String>,
64 },
65
66 Install {
68 names: Vec<ModuleName>,
70
71 #[arg(long)]
73 version: Option<String>,
74
75 #[arg(long)]
78 model_size: Option<String>,
79 },
80
81 #[clap(alias = "url")]
83 Link {
84 name: ModuleName,
86 },
87
88 #[clap(alias = "ls")]
90 List {
91 #[arg(value_name = "FORMAT", short = 'o', long)]
93 output: Option<String>,
94 },
95
96 Resolve {
98 url: String,
100 },
101
102 Search {
104 #[clap(required = true)]
106 query: Vec<String>,
107
108 #[arg(value_name = "FORMAT", short = 'o', long)]
110 output: Option<String>,
111 },
112
113 Uninstall {
115 names: Vec<ModuleName>,
117 },
118
119 #[clap(alias = "update")]
123 Upgrade {
124 names: Vec<ModuleName>,
126
127 #[arg(long)]
129 version: Option<String>,
130
131 #[arg(long)]
134 model_size: Option<String>,
135 },
136}
137
138impl ModuleCommand {
139 pub async fn run(self, flags: &StandardOptions) -> Result<(), BoxError> {
140 use ModuleCommand::*;
141 match self {
142 Browse { name } => browse(name, flags).await,
143
144 Config { command, name } => match (command, name) {
145 (Some(command), _) => command.run(flags).await,
146 (None, Some(name)) => {
148 ConfigCommand::Show {
149 name: name.clone(),
150 output: None,
151 }
152 .run(flags)
153 .await
154 },
155 (None, None) => {
156 ceprintln!("<s,r>error:</> missing module name or subcommand");
157 ceprintln!(
158 "<s,dim>hint:</> See the available subcommands with: <s>asimov module config --help</>"
159 );
160 Err(EX_USAGE.into())
161 },
162 },
163
164 Disable { names } => disable(names, flags).await,
165
166 Doc { name } => doc(name, flags).await,
167
168 Enable { names } => enable(names, flags).await,
169
170 #[cfg(feature = "unstable")]
171 Find { name } => find(name, flags).await,
172
173 Inspect { name, output } => {
174 inspect(name, output.as_deref().unwrap_or("cli").into(), flags).await
175 },
176
177 Install {
178 names,
179 version,
180 model_size,
181 } => install(names, version, model_size, flags).await,
182
183 Link { name } => link(name, flags).await,
184
185 List { output } => list(output.as_deref().unwrap_or("cli").into(), flags).await,
186
187 Resolve { url } => resolve(url, flags).await,
188
189 Search { query, output } => {
190 search(query, output.as_deref().unwrap_or("cli").into(), flags).await
191 },
192
193 Uninstall { names } => uninstall(names, flags).await,
194
195 Upgrade {
196 names,
197 version,
198 model_size,
199 } => upgrade(names, version, model_size, flags).await,
200 }
201 }
202}
203
204mod browse;
205pub use browse::*;
206
207mod config;
208pub use config::*;
209
210mod disable;
211pub use disable::*;
212
213mod doc;
214pub use doc::*;
215
216mod enable;
217pub use enable::*;
218
219mod find;
220pub use find::*;
221
222mod inspect;
223pub use inspect::*;
224
225mod install;
226pub use install::*;
227
228mod link;
229pub use link::*;
230
231mod list;
232pub use list::*;
233
234mod resolve;
235pub use resolve::*;
236
237mod search;
238pub use search::*;
239
240mod uninstall;
241pub use uninstall::*;
242
243mod upgrade;
244pub use upgrade::*;