pub use cqs::parse_target;
use std::path::Path;
use anyhow::Result;
use cqs::config::Config;
use cqs::reference::{self, ReferenceIndex};
use cqs::store::Store;
use cqs::ResolvedTarget;
pub fn resolve_target(store: &Store, target: &str) -> Result<ResolvedTarget> {
let _span = tracing::info_span!("resolve_target", target).entered();
Ok(cqs::resolve_target(store, target)?)
}
pub(crate) fn find_reference(root: &Path, name: &str) -> Result<ReferenceIndex> {
let _span = tracing::info_span!("find_reference", name).entered();
let config = Config::load(root);
let references = reference::load_references(&config.references);
references
.into_iter()
.find(|r| r.name == name)
.ok_or_else(|| {
anyhow::anyhow!(
"Reference '{}' not found. Run 'cqs ref list' to see available references.",
name
)
})
}
fn resolve_reference_db(root: &Path, ref_name: &str) -> Result<std::path::PathBuf> {
use anyhow::bail;
let config = Config::load(root);
let ref_cfg = config
.references
.iter()
.find(|r| r.name == ref_name)
.ok_or_else(|| {
anyhow::anyhow!(
"Reference '{}' not found. Run 'cqs ref list' to see available references.",
ref_name
)
})?;
let ref_db = ref_cfg.path.join("index.db");
if !ref_db.exists() {
bail!(
"Reference '{}' has no index at {}. Run 'cqs ref update {}' first.",
ref_name,
ref_db.display(),
ref_name
);
}
Ok(ref_db)
}
pub(crate) fn resolve_reference_store(root: &Path, ref_name: &str) -> Result<Store> {
use anyhow::Context;
let ref_db = resolve_reference_db(root, ref_name)?;
Store::open(&ref_db)
.with_context(|| format!("Failed to open reference store at {}", ref_db.display()))
}
pub(crate) fn resolve_reference_store_readonly(root: &Path, ref_name: &str) -> Result<Store> {
use anyhow::Context;
let ref_db = resolve_reference_db(root, ref_name)?;
Store::open_readonly(&ref_db)
.with_context(|| format!("Failed to open reference store at {}", ref_db.display()))
}