use crate::{ArcPackage, Cache, Package, SearchBy};
use async_trait::async_trait;
#[async_trait]
pub trait Raur {
type Err;
async fn raw_info<S: AsRef<str> + Send + Sync>(
&self,
pkg_names: &[S],
) -> Result<Vec<Package>, Self::Err>;
async fn info<S: AsRef<str> + Send + Sync>(
&self,
pkg_names: &[S],
) -> Result<Vec<Package>, Self::Err> {
let mut packages = Vec::with_capacity(pkg_names.len());
for chunk in pkg_names.chunks(500) {
packages.extend(self.raw_info(chunk).await?);
}
Ok(packages)
}
async fn cache_info<S: AsRef<str> + Send + Sync>(
&self,
cache: &mut Cache,
pkgs: &[S],
) -> Result<Vec<ArcPackage>, Self::Err> {
let mut ret = Vec::with_capacity(pkgs.len());
let mut resolve = Vec::with_capacity(pkgs.len());
for pkg in pkgs {
if let Some(pkg) = cache.get(pkg.as_ref()) {
ret.push(pkg.clone());
} else {
resolve.push(pkg.as_ref());
}
}
cache.reserve(resolve.len());
for chunk in resolve.chunks(100) {
let res = self.info(chunk).await?;
for pkg in res.into_iter() {
let pkg = ArcPackage::from(pkg);
cache.insert(pkg.clone());
ret.push(pkg);
}
}
Ok(ret)
}
async fn search_by<S: AsRef<str> + Send + Sync>(
&self,
query: S,
strategy: SearchBy,
) -> Result<Vec<Package>, Self::Err>;
async fn search<S: AsRef<str> + Send + Sync>(
&self,
query: S,
) -> Result<Vec<Package>, Self::Err> {
self.search_by(query, SearchBy::default()).await
}
async fn orphans(&self) -> Result<Vec<Package>, Self::Err> {
self.search_by("", SearchBy::Maintainer).await
}
}