asimov_module_cli/commands/
resolve.rs

1// This is free and unencumbered software released into the public domain.
2
3use crate::{
4    StandardOptions,
5    SysexitsError::{self, *},
6};
7use asimov_module::resolve::Resolver;
8use color_print::cprintln;
9
10#[tokio::main]
11pub async fn resolve(url: impl AsRef<str>, _flags: &StandardOptions) -> Result<(), SysexitsError> {
12    let installer = asimov_installer::Installer::default();
13
14    let manifests = installer
15        .enabled_modules()
16        .await
17        .map_err(|e| {
18            tracing::error!("failed to read module manifest directory: {e}");
19            EX_UNAVAILABLE
20        })?
21        .into_iter()
22        .map(|manifest| manifest.manifest);
23
24    let resolver = Resolver::try_from_iter(manifests)
25        .inspect_err(|e| tracing::error!("failed to create resolver: {e}"))?;
26
27    let modules = resolver.resolve(url.as_ref()).inspect_err(|e| {
28        tracing::error!("failed to resolve modules for URL `{}`: {e}", url.as_ref())
29    })?;
30
31    for module in modules {
32        cprintln!("{}", module.name);
33    }
34
35    Ok(())
36}