blob: d537a26f6780f6e61a252e075c747fd6962e6ada [file] [log] [blame]
#[cfg(feature = "local")]
use crate::index::LocalRegistry;
use crate::{
index::{FileLock, RemoteGitIndex, RemoteSparseIndex},
Error, IndexKrate, KrateName,
};
/// A wrapper around either a [`RemoteGitIndex`] or [`RemoteSparseIndex`]
#[non_exhaustive]
pub enum ComboIndex {
/// A standard git based registry index. No longer the default for crates.io
/// as of 1.70.0
Git(RemoteGitIndex),
/// An HTTP sparse index
Sparse(RemoteSparseIndex),
/// A local registry
#[cfg(feature = "local")]
Local(LocalRegistry),
}
impl ComboIndex {
/// Retrieves the index metadata for the specified crate name, optionally
/// writing a cache entry for it if there was not already an up to date one
///
/// Note no cache entry is written if this is a `Local` registry as they do
/// not use .cache files
#[inline]
pub fn krate(
&self,
name: KrateName<'_>,
write_cache_entry: bool,
lock: &FileLock,
) -> Result<Option<IndexKrate>, Error> {
match self {
Self::Git(index) => index.krate(name, write_cache_entry, lock),
Self::Sparse(index) => index.krate(name, write_cache_entry, lock),
#[cfg(feature = "local")]
Self::Local(lr) => lr.cached_krate(name, lock),
}
}
/// Retrieves the cached crate metadata if it exists
#[inline]
pub fn cached_krate(
&self,
name: KrateName<'_>,
lock: &FileLock,
) -> Result<Option<IndexKrate>, Error> {
match self {
Self::Git(index) => index.cached_krate(name, lock),
Self::Sparse(index) => index.cached_krate(name, lock),
#[cfg(feature = "local")]
Self::Local(lr) => lr.cached_krate(name, lock),
}
}
}
impl From<RemoteGitIndex> for ComboIndex {
#[inline]
fn from(index: RemoteGitIndex) -> Self {
Self::Git(index)
}
}
impl From<RemoteSparseIndex> for ComboIndex {
#[inline]
fn from(index: RemoteSparseIndex) -> Self {
Self::Sparse(index)
}
}
#[cfg(feature = "local")]
impl From<LocalRegistry> for ComboIndex {
#[inline]
fn from(local: LocalRegistry) -> Self {
Self::Local(local)
}
}