pub struct SparseIndexClient { /* private fields */ }Expand description
Client for one sparse-index registry — crates.io’s own index or an alternate/private
one resolved from .cargo/config.toml.
Owns base_url/sparse_index_path/parse_index_json (moved from the pre-existing
crates.io-only client, not reimplemented), so every registry speaking this protocol
shares one parser and one crate-name safety gate.
Implementations§
Source§impl SparseIndexClient
impl SparseIndexClient
Sourcepub fn new(index: RegistryIndex, cache: Arc<HttpCache>) -> Self
pub fn new(index: RegistryIndex, cache: Arc<HttpCache>) -> Self
Creates a new unauthenticated sparse-index client for index.
Takes a validated RegistryIndex, not a bare String (plan-1b §1.2, critic S2):
RegistryIndex::new’s crate::config::IndexTrust/policy gate is the only public
constructor of a fetchable index URL, so this client cannot be built with one that
skipped it.
Sourcepub fn with_auth(
index: RegistryIndex,
cache: Arc<HttpCache>,
auth: Option<AuthToken>,
registry_display_name: &'static str,
) -> Self
pub fn with_auth( index: RegistryIndex, cache: Arc<HttpCache>, auth: Option<AuthToken>, registry_display_name: &'static str, ) -> Self
Creates a new sparse-index client for index, attaching auth (if any) to
every request as a Bearer Authorization header, and using
registry_display_name in not-found error messages.
Sourcepub async fn get_versions(&self, name: &str) -> Result<Vec<CargoVersion>>
pub async fn get_versions(&self, name: &str) -> Result<Vec<CargoVersion>>
Fetches all versions for a crate from the sparse index.
Returns versions sorted newest-first. Includes yanked versions.
§Errors
Returns an error if:
- HTTP request fails
- Response body is invalid UTF-8
- JSON parsing fails
§Examples
let cache = Arc::new(HttpCache::new());
let policy = deps_core::net_policy::RegistryAccessPolicy::default();
let index = deps_cargo::config::RegistryIndex::new(
"https://index.crates.io",
deps_cargo::config::IndexTrust::Trusted,
&policy,
).unwrap();
let client = SparseIndexClient::new(index, cache);
let versions = client.get_versions("serde").await.unwrap();
assert!(!versions.is_empty());Sourcepub async fn get_latest_matching(
&self,
name: &str,
req_str: &str,
) -> Result<Option<CargoVersion>>
pub async fn get_latest_matching( &self, name: &str, req_str: &str, ) -> Result<Option<CargoVersion>>
Finds the latest version matching the given semver requirement.
Only returns non-yanked versions.
§Errors
Returns an error if:
- Version requirement string is invalid semver
- HTTP request fails
Trait Implementations§
Source§impl Clone for SparseIndexClient
impl Clone for SparseIndexClient
Source§fn clone(&self) -> SparseIndexClient
fn clone(&self) -> SparseIndexClient
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Registry for SparseIndexClient
A deps_core::Registry implementation over one SparseIndexClient directly — used
for a resolved alternate registry, so completion (which needs a concrete &dyn Registry
to hand to deps_core::completion’s shared generic helpers) can address one specific
alternate index without going through CargoRegistry’s source-based dispatch.
impl Registry for SparseIndexClient
A deps_core::Registry implementation over one SparseIndexClient directly — used
for a resolved alternate registry, so completion (which needs a concrete &dyn Registry
to hand to deps_core::completion’s shared generic helpers) can address one specific
alternate index without going through CargoRegistry’s source-based dispatch.
search is always empty: the sparse index protocol has no search endpoint (spec
Out-of-Scope), so an alternate registry can never support package-name completion —
only crates.io’s REST API does.
Source§fn get_versions<'a>(
&'a self,
name: &'a PackageName,
) -> BoxFuture<'a, Result<Vec<Box<dyn Version>>>>
fn get_versions<'a>( &'a self, name: &'a PackageName, ) -> BoxFuture<'a, Result<Vec<Box<dyn Version>>>>
Source§fn get_latest_matching<'a>(
&'a self,
name: &'a PackageName,
req: &'a VersionReq,
) -> BoxFuture<'a, Result<Option<Box<dyn Version>>>>
fn get_latest_matching<'a>( &'a self, name: &'a PackageName, req: &'a VersionReq, ) -> BoxFuture<'a, Result<Option<Box<dyn Version>>>>
Source§fn select_latest_matching(
&self,
versions: &[Box<dyn Version>],
req: &VersionReq,
) -> Option<usize>
fn select_latest_matching( &self, versions: &[Box<dyn Version>], req: &VersionReq, ) -> Option<usize>
Source§fn search<'a>(
&'a self,
_query: &'a str,
_limit: usize,
) -> BoxFuture<'a, Result<Vec<Box<dyn Metadata>>>>
fn search<'a>( &'a self, _query: &'a str, _limit: usize, ) -> BoxFuture<'a, Result<Vec<Box<dyn Metadata>>>>
Source§fn as_any(&self) -> &dyn Any
fn as_any(&self) -> &dyn Any
Source§fn get_versions_with<'a>(
&'a self,
name: &'a PackageName,
freshness: FreshnessSettings,
) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Version>>, DepsError>> + Send + 'a>>
fn get_versions_with<'a>( &'a self, name: &'a PackageName, freshness: FreshnessSettings, ) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Version>>, DepsError>> + Send + 'a>>
get_versions, but lets a registry that can obtain
Version::published_at only through an extra request gate that request behind
freshness.enabled instead of always paying for it. Read moreSource§fn get_versions_from<'a>(
&'a self,
name: &'a PackageName,
source: &'a DependencySource,
freshness: FreshnessSettings,
) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Version>>, DepsError>> + Send + 'a>>
fn get_versions_from<'a>( &'a self, name: &'a PackageName, source: &'a DependencySource, freshness: FreshnessSettings, ) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Version>>, DepsError>> + Send + 'a>>
get_versions_with, but additionally carries the
dependency’s resolved DependencySource, for a registry that routes a single
fetch across more than one underlying index (e.g. deps-cargo’s CargoRegistry,
which dispatches a DependencySource::AlternateRegistry to a private sparse index
instead of crates.io). Read moreSource§fn get_latest_matching_with_context<'a>(
&'a self,
name: &'a PackageName,
req: &'a VersionReq,
minimum_stability: Option<&'a str>,
) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Version>>, DepsError>> + Send + 'a>>
fn get_latest_matching_with_context<'a>( &'a self, name: &'a PackageName, req: &'a VersionReq, minimum_stability: Option<&'a str>, ) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Version>>, DepsError>> + Send + 'a>>
get_latest_matching, but lets a registry whose
“latest matching” selection can be refined by ecosystem-specific manifest state (e.g.
Composer’s minimum-stability field, #424) read it, alongside req. Read moreSource§fn get_latest_matching_from<'a>(
&'a self,
name: &'a PackageName,
source: &'a DependencySource,
req: &'a VersionReq,
minimum_stability: Option<&'a str>,
) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Version>>, DepsError>> + Send + 'a>>
fn get_latest_matching_from<'a>( &'a self, name: &'a PackageName, source: &'a DependencySource, req: &'a VersionReq, minimum_stability: Option<&'a str>, ) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Version>>, DepsError>> + Send + 'a>>
get_latest_matching_with_context,
but additionally carries the dependency’s resolved DependencySource — the
get_latest_matching-shaped counterpart to
get_versions_from, covering the fallback path a caller
takes when the list-based pick fails on a non-empty get_versions_from
result (see deps_core::lsp_helpers::hover’s list_fallback_latest and
deps-lsp’s background-fetch fallback for the two call sites this exists for). Read moreSource§fn select_latest_matching_with_context(
&self,
versions: &[Box<dyn Version>],
req: &VersionReq,
minimum_stability: Option<&str>,
) -> Option<usize>
fn select_latest_matching_with_context( &self, versions: &[Box<dyn Version>], req: &VersionReq, minimum_stability: Option<&str>, ) -> Option<usize>
select_latest_matching, but lets a registry
whose selection can be refined by ecosystem-specific manifest state (e.g. Composer’s
minimum-stability field, #424) read it, alongside versions and req. See
get_latest_matching_with_context for why
minimum_stability is an opaque per-ecosystem string rather than a shared type. Read moreSource§fn reports_yanked(&self) -> bool
fn reports_yanked(&self) -> bool
get_versions results carry meaningful
per-version yank/deprecation data via Version::removal_status. Read more