use anyhow::Result;
use cleanlib_client::{config, transport};
use crate::cache::{default_cache_dir, PersistentCache};
use crate::render::terminal;
use super::verdict_exit_code;
pub async fn run(ecosystem: String, package: String, version: String, output: String) -> Result<()> {
let path = config::default_path();
let cfg = config::load_with_env_overrides(path.as_deref())?;
let client = transport::Client::from_config(&cfg)?;
let (verdict, from_cache) = match client.fetch_verdict(&ecosystem, &package, &version).await {
Ok(v) => {
if let Some(dir) = default_cache_dir() {
if let Ok(cache) = PersistentCache::open(&dir) {
let _ = cache.put(&ecosystem, &package, &version, v.clone());
}
}
(v, false)
}
Err(e) => {
if let Some(dir) = default_cache_dir() {
if let Ok(cache) = PersistentCache::open(&dir) {
if let Ok(Some(entry)) = cache.get(&ecosystem, &package, &version) {
if let Some(cached_at) = entry.cached_at() {
eprintln!(
"# warning: cleanlib-enrich unreachable; serving cached verdict (cached: {})",
cached_at.format("%Y-%m-%d")
);
} else {
eprintln!(
"# warning: cleanlib-enrich unreachable; serving cached verdict"
);
}
render_verdict(&entry.envelope, &output)?;
let code = verdict_exit_code(&entry.envelope);
if code != 0 {
std::process::exit(code);
}
return Ok(());
}
}
}
return Err(e.into());
}
};
let _ = from_cache;
render_verdict(&verdict, &output)?;
let code = verdict_exit_code(&verdict);
if code != 0 {
std::process::exit(code);
}
Ok(())
}
fn render_verdict(v: &cleanlib_client::types::Verdict, output: &str) -> Result<()> {
match output {
"json" => println!("{}", serde_json::to_string_pretty(v)?),
_ => terminal::render_verdict(v, &terminal::RenderOpts::default()),
}
Ok(())
}