11use super :: { SYSTEM_REGISTRY_MODULES , SystemRegistryModule , load_config, resolve_modules_context} ;
2- use crate :: common:: PathConfigArgs ;
2+ use crate :: common:: { PathConfigArgs , Registry } ;
33use crate :: config:: app_config:: ModuleConfig ;
44use anyhow:: { Context , bail} ;
55use clap:: Args ;
@@ -27,9 +27,11 @@ pub struct ListArgs {
2727 /// Show all information related to the module.
2828 #[ arg( short = 'v' , long) ]
2929 verbose : bool ,
30- /// Registry to query when verbose mode is enabled.
31- #[ arg( long, default_value = "crates.io" ) ]
32- registry : String ,
30+ /// Registry to query for system-crate metadata. Only consulted when both
31+ /// `--system` and `--verbose` are enabled; `--verbose` alone does not query
32+ /// any registry. Defaults to `crates.io`.
33+ #[ arg( long, value_enum, default_value_t = Registry :: CratesIo ) ]
34+ registry : Registry ,
3335}
3436
3537impl ListArgs {
@@ -42,19 +44,13 @@ impl ListArgs {
4244 if self . system {
4345 println ! ( "System crates:" ) ;
4446 if self . verbose {
45- if self . registry != "crates.io" {
46- let registry = & self . registry ;
47- bail ! (
48- "unsupported registry '{registry}'. Only 'crates.io' is currently supported"
49- ) ;
50- }
51-
5247 let runtime = tokio:: runtime:: Builder :: new_current_thread ( )
5348 . enable_all ( )
5449 . build ( )
5550 . context ( "failed to build tokio runtime for registry queries" ) ?;
5651
57- let metadata_by_crate = runtime. block_on ( fetch_all_crates_io_metadata ( ) ) ?;
52+ let metadata_by_crate =
53+ runtime. block_on ( fetch_all_registry_metadata ( self . registry ) ) ?;
5854
5955 for module in SYSTEM_REGISTRY_MODULES {
6056 let Some ( metadata) = metadata_by_crate. get ( module. crate_name ) else {
@@ -208,7 +204,9 @@ struct CrateVersion {
208204 features : BTreeMap < String , Vec < String > > ,
209205}
210206
211- async fn fetch_all_crates_io_metadata ( ) -> anyhow:: Result < HashMap < & ' static str , RegistryMetadata > > {
207+ async fn fetch_all_registry_metadata (
208+ registry : Registry ,
209+ ) -> anyhow:: Result < HashMap < & ' static str , RegistryMetadata > > {
212210 let semaphore = std:: sync:: Arc :: new ( tokio:: sync:: Semaphore :: new ( 4 ) ) ;
213211 let client = Client :: builder ( )
214212 . user_agent ( "cyberfabric-cli" )
@@ -225,7 +223,7 @@ async fn fetch_all_crates_io_metadata() -> anyhow::Result<HashMap<&'static str,
225223 . acquire_owned ( )
226224 . await
227225 . context ( "failed to acquire registry fetch permit" ) ?;
228- let metadata = fetch_crates_io_metadata ( & cloned_client, module)
226+ let metadata = fetch_registry_metadata ( & cloned_client, registry , module)
229227 . await
230228 . with_context ( || format ! ( "failed to fetch metadata for '{}'" , module. crate_name) ) ?;
231229 Ok :: < _ , anyhow:: Error > ( ( module. crate_name , metadata) )
@@ -241,11 +239,12 @@ async fn fetch_all_crates_io_metadata() -> anyhow::Result<HashMap<&'static str,
241239 Ok ( metadata_by_crate)
242240}
243241
244- async fn fetch_crates_io_metadata (
242+ async fn fetch_registry_metadata (
245243 client : & Client ,
244+ registry : Registry ,
246245 module : SystemRegistryModule ,
247246) -> anyhow:: Result < RegistryMetadata > {
248- let crate_url = format ! ( "https://crates.io /api/v1/crates/{}" , module. crate_name) ;
247+ let crate_url = format ! ( "https://{registry} /api/v1/crates/{}" , module. crate_name) ;
249248 let crate_response = client
250249 . get ( & crate_url)
251250 . send ( )
@@ -264,7 +263,8 @@ async fn fetch_crates_io_metadata(
264263 . find ( |version| version. num == latest_version)
265264 . map_or_else ( Vec :: new, |version| version. features . into_keys ( ) . collect ( ) ) ;
266265
267- let module_rs_content = fetch_module_rs_content ( client, module, & latest_version) . await ?;
266+ let module_rs_content =
267+ fetch_module_rs_content ( client, registry, module, & latest_version) . await ?;
268268 let module_metadata = parse_module_rs_source ( & module_rs_content)
269269 . with_context ( || format ! ( "invalid src/module.rs for {}" , module. crate_name) ) ?;
270270
@@ -278,11 +278,12 @@ async fn fetch_crates_io_metadata(
278278
279279async fn fetch_module_rs_content (
280280 client : & Client ,
281+ registry : Registry ,
281282 module : SystemRegistryModule ,
282283 latest_version : & str ,
283284) -> anyhow:: Result < String > {
284285 let download_url = format ! (
285- "https://crates.io /api/v1/crates/{}/{}/download" ,
286+ "https://{registry} /api/v1/crates/{}/{}/download" ,
286287 module. crate_name, latest_version
287288 ) ;
288289 let crate_archive = client
0 commit comments