1use clientele::{StandardOptions, crates::clap::Subcommand};
4use core::error::Error;
5use std::{string::String, vec::Vec};
6
7#[derive(Debug, Subcommand)]
8pub enum ModuleCommand {
9 #[clap(alias = "open")]
11 Browse {
12 name: String,
14 },
15
16 #[clap(override_usage = CONFIG_USAGE)]
18 Config {
19 name: String,
21
22 #[arg(short = 'u', long, default_value = "false")]
24 unset: bool,
25
26 #[clap(trailing_var_arg = true)]
28 args: Vec<String>,
29 },
30
31 Disable {
33 names: Vec<String>,
35 },
36
37 Enable {
39 names: Vec<String>,
41 },
42
43 #[cfg(feature = "unstable")]
45 #[clap(alias = "which")]
46 Find {
47 name: String,
49 },
50
51 #[cfg(feature = "unstable")]
53 #[clap(alias = "show")]
54 Inspect {
55 name: String,
57 },
58
59 Install {
61 names: Vec<String>,
63
64 #[arg(long)]
66 version: Option<String>,
67
68 #[arg(long)]
71 model_size: Option<String>,
72 },
73
74 #[clap(alias = "url")]
76 Link {
77 name: String,
79 },
80
81 #[clap(alias = "ls")]
83 List {
84 #[arg(value_name = "FORMAT", short = 'o', long)]
86 output: Option<String>,
87 },
88
89 #[cfg(feature = "module-new")]
91 New {
92 name: String,
94
95 #[arg(long)]
98 dir: Option<String>,
99
100 #[arg(long, default_value = "emitter")]
104 program: Vec<String>,
105
106 #[arg(long)]
109 summary: Option<String>,
110 },
111
112 Resolve {
114 url: String,
116 },
117
118 Uninstall {
120 names: Vec<String>,
122 },
123
124 #[clap(alias = "update")]
128 Upgrade {
129 names: Vec<String>,
131
132 #[arg(long)]
134 version: Option<String>,
135
136 #[arg(long)]
139 model_size: Option<String>,
140 },
141}
142
143impl ModuleCommand {
144 pub async fn run(&self, flags: &StandardOptions) -> Result<(), Box<dyn Error>> {
145 use ModuleCommand::*;
146 match self {
147 Browse { name } => browse(name, flags).await,
148 Config { name, unset, args } => config(name, *unset, &args, flags).await,
149 Disable { names } => disable(names, flags).await,
150 Enable { names } => enable(names, flags).await,
151 #[cfg(feature = "unstable")]
152 Find { name } => find(name, flags).await,
153 #[cfg(feature = "unstable")]
154 Inspect { name } => inspect(name, flags).await,
155 Install {
156 names,
157 version,
158 model_size,
159 } => install(names, version, model_size, flags).await,
160 Link { name } => link(name, flags).await,
161 List { output } => list(output.as_deref().unwrap_or(&"cli"), flags).await,
162 #[cfg(feature = "module-new")]
163 New {
164 name,
165 dir,
166 program,
167 summary,
168 } => new(name, dir.as_deref(), program, summary.as_deref(), flags).await,
169 Resolve { url } => resolve(url, flags).await,
170 Uninstall { names } => uninstall(names, flags).await,
171 Upgrade {
172 names,
173 version,
174 model_size,
175 } => upgrade(names, version, model_size, flags).await,
176 }
177 }
178}
179
180const CONFIG_USAGE: &str = r#"
182 config <module> # Interactive configuration
183 config <module> <key> # Show value for key
184 config <module> [<key> <value>]... # Set key(s) to value(s)
185"#;
186
187mod browse;
188pub use browse::*;
189
190mod config;
191pub use config::*;
192
193mod disable;
194pub use disable::*;
195
196mod enable;
197pub use enable::*;
198
199mod find;
200pub use find::*;
201
202mod inspect;
203pub use inspect::*;
204
205mod install;
206pub use install::*;
207
208mod link;
209pub use link::*;
210
211mod list;
212pub use list::*;
213
214#[cfg(feature = "module-new")]
215mod new;
216#[cfg(feature = "module-new")]
217pub use new::*;
218
219mod resolve;
220pub use resolve::*;
221
222mod uninstall;
223pub use uninstall::*;
224
225mod upgrade;
226pub use upgrade::*;