pub struct GoRegistry { /* private fields */ }Expand description
Client for interacting with proxy.golang.org.
Uses the Go module proxy protocol for version lookups and metadata. All requests are cached via the provided HttpCache.
Implementations§
Source§impl GoRegistry
impl GoRegistry
Sourcepub fn new(cache: Arc<HttpCache>) -> GoRegistry
pub fn new(cache: Arc<HttpCache>) -> GoRegistry
Creates a new Go registry client with the given HTTP cache.
Sourcepub fn register_chain(root: &Arc<GoRegistry>, chain: &GoProxyChain)
pub fn register_chain(root: &Arc<GoRegistry>, chain: &GoProxyChain)
Builds the full hop chain for one GoProxyChain and inserts the head into
root.alternates under chain.key. Idempotent per key (a repeat registration for the
same key is a no-op), capacity-capped at MAX_ALTERNATE_REGISTRIES. Mirrors
deps_pypi::PypiRegistry::register_chain exactly in shape.
Sourcepub fn alternate_client(&self, index: &str) -> Option<Arc<GoRegistry>>
pub fn alternate_client(&self, index: &str) -> Option<Arc<GoRegistry>>
The registered client for index (a GoProxyChain::key or
crate::config::GOPRIVATE_CHAIN_KEY), if any — read-only, performs no registration,
no validation.
Only ever meaningful on the root: a chain-hop leaf’s own alternates map is
always empty by construction (Self::with_base/Self::terminal never populate
it).
Sourcepub async fn get_versions(
&self,
module_path: &str,
) -> Result<Vec<GoVersion>, DepsError>
pub async fn get_versions( &self, module_path: &str, ) -> Result<Vec<GoVersion>, DepsError>
Fetches all versions for a module from the /@v/list endpoint.
Returns versions in registry order (not sorted). Includes pseudo-versions.
§Errors
Returns an error if:
- HTTP request fails
- Response body is invalid UTF-8
- Module does not exist (404)
- Module path is invalid or too long
§Examples
let cache = Arc::new(HttpCache::new());
let registry = GoRegistry::new(cache);
let versions = registry.get_versions("github.com/gin-gonic/gin").await.unwrap();
assert!(!versions.is_empty());Sourcepub async fn get_version_info(
&self,
module_path: &str,
version: &str,
) -> Result<GoVersion, DepsError>
pub async fn get_version_info( &self, module_path: &str, version: &str, ) -> Result<GoVersion, DepsError>
Fetches version metadata from the /@v/{version}.info endpoint.
Returns version with timestamp information.
§Errors
Returns an error if:
- HTTP request fails
- JSON parsing fails
- Module path or version string is invalid
§Examples
let cache = Arc::new(HttpCache::new());
let registry = GoRegistry::new(cache);
let info = registry.get_version_info("github.com/gin-gonic/gin", "v1.9.1").await.unwrap();
assert_eq!(info.version, "v1.9.1");Sourcepub async fn get_latest(
&self,
module_path: &str,
) -> Result<GoVersion, DepsError>
pub async fn get_latest( &self, module_path: &str, ) -> Result<GoVersion, DepsError>
Fetches latest version using the /@latest endpoint.
Returns the latest stable version (non-pseudo).
§Errors
Returns an error if:
- HTTP request fails
- JSON parsing fails
- Module path is invalid
§Examples
let cache = Arc::new(HttpCache::new());
let registry = GoRegistry::new(cache);
let latest = registry.get_latest("github.com/gin-gonic/gin").await.unwrap();
assert!(!latest.is_pseudo);Sourcepub async fn get_go_mod(
&self,
module_path: &str,
version: &str,
) -> Result<String, DepsError>
pub async fn get_go_mod( &self, module_path: &str, version: &str, ) -> Result<String, DepsError>
Fetches the go.mod file for a specific version.
Returns the raw content of the go.mod file.
§Errors
Returns an error if:
- HTTP request fails
- Response body is invalid UTF-8
- Module path or version string is invalid
§Examples
let cache = Arc::new(HttpCache::new());
let registry = GoRegistry::new(cache);
let go_mod = registry.get_go_mod("github.com/gin-gonic/gin", "v1.9.1").await.unwrap();
assert!(go_mod.contains("module github.com/gin-gonic/gin"));Trait Implementations§
Source§impl Clone for GoRegistry
impl Clone for GoRegistry
Source§fn clone(&self) -> GoRegistry
fn clone(&self) -> GoRegistry
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 GoRegistry
impl Registry for GoRegistry
Source§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>>
Dispatches by source (spec 034 FR-013): an AlternateRegistry whose index has a
registered client routes through GoRegistry::get_versions_chained (FR-005’s chain
walk); one with no registered client is PackageNotFound, never a fall back to
proxy.golang.org (Go always sets mirrors_crates_io: false, so Cargo’s
mirror-degradation arm is dead here and must not be written — falling back would send
a private module path to the public proxy, the exact class of leak FR-008/FR-009
close). Every other source keeps today’s public-registry path unchanged.
Source§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_versions_from’s get_latest_matching-shaped counterpart — same dispatch, same
“never fall back to proxy.golang.org for an unregistered AlternateRegistry”
invariant. Derived from GoRegistry::get_versions_chained +
deps_core::Registry::select_latest_matching (mirrors deps-pypi’s identical
derivation) rather than an independent per-hop matching walk — the winning hop (first
hop with a non-empty version list) is selected once, and matching happens only within
that single hop’s list. No /@latest fast path for a chain hop (unlike the plain
public-registry path below): phase 1 keeps this simple and correct rather than
optimizing an extra request off the private-proxy path.
Source§fn get_versions<'a>(
&'a self,
name: &'a PackageName,
) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Version>>, DepsError>> + Send + 'a>>
fn get_versions<'a>( &'a self, name: &'a PackageName, ) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Version>>, DepsError>> + Send + 'a>>
Source§fn get_latest_matching<'a>(
&'a self,
name: &'a PackageName,
_req: &'a VersionReq,
) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Version>>, DepsError>> + Send + 'a>>
fn get_latest_matching<'a>( &'a self, name: &'a PackageName, _req: &'a VersionReq, ) -> Pin<Box<dyn Future<Output = Result<Option<Box<dyn Version>>, DepsError>> + Send + 'a>>
Source§fn search<'a>(
&'a self,
_query: &'a str,
_limit: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Metadata>>, DepsError>> + Send + 'a>>
fn search<'a>( &'a self, _query: &'a str, _limit: usize, ) -> Pin<Box<dyn Future<Output = Result<Vec<Box<dyn Metadata>>, DepsError>> + Send + 'a>>
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 reports_yanked(&self) -> bool
fn reports_yanked(&self) -> bool
get_versions results carry meaningful
per-version yank/deprecation data via Version::removal_status. Read moreSource§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
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_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 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 moreAuto Trait Implementations§
impl !RefUnwindSafe for GoRegistry
impl !UnwindSafe for GoRegistry
impl Freeze for GoRegistry
impl Send for GoRegistry
impl Sync for GoRegistry
impl Unpin for GoRegistry
impl UnsafeUnpin for GoRegistry
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more