use uv_distribution_types::IndexMetadata;
use uv_pypi_types::VerbatimParsedUrl;
use crate::fork_indexes::ForkIndexes;
use crate::fork_urls::ForkUrls;
use crate::pubgrub::PubGrubPackage;
use crate::resolver::urls::Urls;
#[derive(Debug, Clone, Copy)]
pub(super) enum PackageSource<'a> {
Url(&'a VerbatimParsedUrl),
Registry(Option<&'a IndexMetadata>),
}
impl<'a> PackageSource<'a> {
pub(super) fn from_fork(
package: &PubGrubPackage,
fork_urls: &'a ForkUrls,
fork_indexes: &'a ForkIndexes,
) -> Self {
if let Some(url) = package.name().and_then(|name| fork_urls.get(name)) {
Self::Url(url)
} else {
Self::Registry(package.name().and_then(|name| fork_indexes.get(name)))
}
}
pub(super) fn for_prefetch(
package: &PubGrubPackage,
fork_urls: &'a ForkUrls,
fork_indexes: &'a ForkIndexes,
urls: &Urls,
) -> Option<Self> {
let source = Self::from_fork(package, fork_urls, fork_indexes);
match source {
Self::Url(_) => Some(source),
Self::Registry(_) => {
if package.name().is_none_or(|name| urls.any_url(name)) {
None
} else {
Some(source)
}
}
}
}
}