use std::fmt::Debug;
use anyhow::Error;
use crate::runtime::resolver::{PackageSpecifier, PackageSummary};
#[async_trait::async_trait]
pub trait Source: Sync + Debug {
async fn query(&self, package: &PackageSpecifier) -> Result<Vec<PackageSummary>, Error>;
async fn latest(&self, pkg: &PackageSpecifier) -> Result<PackageSummary, Error> {
let candidates = self.query(pkg).await?;
candidates
.into_iter()
.max_by(|left, right| left.pkg.version.cmp(&right.pkg.version))
.ok_or_else(|| Error::msg("Couldn't find a package version satisfying that constraint"))
}
}
#[async_trait::async_trait]
impl<D, S> Source for D
where
D: std::ops::Deref<Target = S> + Debug + Send + Sync,
S: Source + ?Sized + Send + Sync + 'static,
{
async fn query(&self, package: &PackageSpecifier) -> Result<Vec<PackageSummary>, Error> {
(**self).query(package).await
}
}