uv_resolver/resolver/
index.rs1use std::hash::BuildHasherDefault;
2use std::sync::Arc;
3
4use rustc_hash::FxHasher;
5use uv_distribution_types::{IndexUrl, VariantsJsonContent};
6use uv_normalize::PackageName;
7use uv_once_map::{RegisteredEntry, RegisteredOnceMap};
8use uv_resolver_types::DistributionMetadataIndex;
9
10use crate::prioritized_distribution::RegistryVariantsJson;
11use crate::resolver::provider::{MetadataUnavailable, VersionsResponse};
12
13#[derive(Default, Clone)]
15pub struct InMemoryIndex(Arc<SharedInMemoryIndex>);
16
17#[derive(Default)]
18struct SharedInMemoryIndex {
19 implicit: FxOnceMap<PackageName, Arc<VersionsResponse>>,
22
23 explicit: FxOnceMap<(PackageName, IndexUrl), Arc<VersionsResponse>>,
24
25 distributions: DistributionMetadataIndex,
27
28 variants_json: FxOnceMap<RegistryVariantsJson, Arc<ParsedVariantsJsonResponse>>,
30}
31
32pub(crate) type ParsedVariantsJsonResponse = Result<VariantsJsonContent, MetadataUnavailable>;
33pub(crate) type FxOnceMap<K, V> = RegisteredOnceMap<K, V, BuildHasherDefault<FxHasher>>;
34pub(crate) type FxRegisteredEntry<'a, K, V> =
35 RegisteredEntry<'a, K, V, BuildHasherDefault<FxHasher>>;
36
37impl InMemoryIndex {
38 pub(crate) fn implicit(&self) -> &FxOnceMap<PackageName, Arc<VersionsResponse>> {
40 &self.0.implicit
41 }
42
43 pub(crate) fn explicit(&self) -> &FxOnceMap<(PackageName, IndexUrl), Arc<VersionsResponse>> {
45 &self.0.explicit
46 }
47
48 pub fn distributions(&self) -> &DistributionMetadataIndex {
50 &self.0.distributions
51 }
52
53 pub(crate) fn variants_json(
54 &self,
55 ) -> &FxOnceMap<RegistryVariantsJson, Arc<ParsedVariantsJsonResponse>> {
56 &self.0.variants_json
57 }
58
59 pub fn distributions_mut(&mut self) -> Option<&mut DistributionMetadataIndex> {
61 Arc::get_mut(&mut self.0).map(|index| &mut index.distributions)
62 }
63}