use std::path::{Path, PathBuf};
use dbmd_core::Store;
use crate::cli::LinksArgs;
use crate::context::Context;
use crate::error::CliResult;
pub fn run(ctx: &Context, args: &LinksArgs) -> CliResult {
let store = open_store(&args.dir)?;
let target = Path::new(&args.target);
let mut links: Vec<PathBuf> = store.find_links_to(target).map_err(map_store_error)?;
links.sort();
if ctx.json {
print!("{}", links_json(&args.target, &links));
} else {
print!("{}", links_text(&links));
}
Ok(())
}
fn open_store(dir: &str) -> Result<Store, crate::error::CliError> {
Store::open(Path::new(dir)).map_err(|e| crate::error::CliError::from(dbmd_core::Error::from(e)))
}
fn map_store_error(err: dbmd_core::StoreError) -> crate::error::CliError {
crate::error::CliError::from(dbmd_core::Error::from(err))
}
fn links_text(links: &[PathBuf]) -> String {
let mut out = String::new();
for link in links {
out.push_str(&link.to_string_lossy());
out.push('\n');
}
out
}
fn links_json(target: &str, links: &[PathBuf]) -> String {
let paths: Vec<String> = links
.iter()
.map(|p| p.to_string_lossy().into_owned())
.collect();
let obj = serde_json::json!({
"target": target,
"count": paths.len(),
"links": paths,
});
let mut s = serde_json::to_string_pretty(&obj).unwrap_or_else(|_| "{}".to_string());
s.push('\n');
s
}