use dora_hub_client::{
config::{IndexConfig, ResolvedConfig},
index::IndexCatalog,
transport::IndexFetcher,
};
use eyre::Context;
pub fn sanitize(s: &str) -> String {
s.chars().filter(|c| !c.is_control()).collect()
}
pub struct HubContext {
pub config: ResolvedConfig,
pub fetcher: IndexFetcher,
}
impl HubContext {
pub fn load(offline: bool) -> eyre::Result<Self> {
Ok(Self {
config: ResolvedConfig::load_default().context("failed to load hub configuration")?,
fetcher: IndexFetcher::new(offline)?,
})
}
pub fn catalog_for_namespace(&mut self, namespace: &str) -> eyre::Result<IndexCatalog> {
let index = self.config.index_for_namespace(namespace).clone();
self.open(&index)
}
pub fn all_catalogs(&mut self) -> Vec<(String, IndexCatalog)> {
let indexes = self.config.indexes.clone();
indexes
.into_iter()
.filter_map(|index| {
let alias = index.alias.clone();
match self.open(&index) {
Ok(catalog) => Some((alias, catalog)),
Err(err) => {
eprintln!(" warning: skipping index `{alias}`: {err:#}");
None
}
}
})
.collect()
}
fn open(&mut self, index: &IndexConfig) -> eyre::Result<IndexCatalog> {
let dir = self
.fetcher
.catalog_dir(index, &self.config.config_dir)
.with_context(|| format!("failed to fetch index `{}`", index.alias))?;
IndexCatalog::open(&dir)
}
pub fn drain_warnings(&mut self) {
for warning in self.fetcher.warnings.drain(..) {
eprintln!(" warning: {warning}");
}
}
}