Skip to content

Commit a11c814

Browse files
committed
Don't change DependencyProvider
1 parent 96289f9 commit a11c814

File tree

5 files changed

+35
-46
lines changed

5 files changed

+35
-46
lines changed

examples/caching_dependency_provider.rs

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::cell::RefCell;
44

55
use pubgrub::range::Range;
66
use pubgrub::solver::{resolve, Dependencies, DependencyProvider, OfflineDependencyProvider};
7+
use pubgrub::type_aliases::DependencyConstraints;
78

89
type NumVS = Range<u32>;
910

@@ -29,37 +30,27 @@ impl<DP: DependencyProvider<M = String>> DependencyProvider for CachingDependenc
2930
&self,
3031
package: &DP::P,
3132
version: &DP::V,
32-
) -> Result<Dependencies<impl IntoIterator<Item = (DP::P, DP::VS)> + Clone, Self::M>, DP::Err>
33-
{
33+
) -> Result<Dependencies<DependencyConstraints<DP::P, DP::VS>, DP::M>, DP::Err> {
3434
let mut cache = self.cached_dependencies.borrow_mut();
3535
match cache.get_dependencies(package, version) {
3636
Ok(Dependencies::Unavailable(_)) => {
37-
// Code below to end the borrow.
38-
}
39-
Ok(dependencies) => {
40-
return Ok(match dependencies {
41-
Dependencies::Unavailable(reason) => Dependencies::Unavailable(reason),
42-
Dependencies::Available(available) => Dependencies::Available(
43-
available.into_iter().collect::<Vec<(Self::P, Self::VS)>>(),
44-
),
45-
})
37+
let dependencies = self.remote_dependencies.get_dependencies(package, version);
38+
match dependencies {
39+
Ok(Dependencies::Available(dependencies)) => {
40+
cache.add_dependencies(
41+
package.clone(),
42+
version.clone(),
43+
dependencies.clone(),
44+
);
45+
Ok(Dependencies::Available(dependencies))
46+
}
47+
Ok(Dependencies::Unavailable(reason)) => Ok(Dependencies::Unavailable(reason)),
48+
error @ Err(_) => error,
49+
}
4650
}
51+
Ok(dependencies) => Ok(dependencies),
4752
Err(_) => unreachable!(),
4853
}
49-
let dependencies = self.remote_dependencies.get_dependencies(package, version);
50-
match dependencies {
51-
Ok(Dependencies::Available(dependencies)) => {
52-
cache.add_dependencies(package.clone(), version.clone(), dependencies.clone());
53-
Ok(Dependencies::Available(
54-
dependencies
55-
.clone()
56-
.into_iter()
57-
.collect::<Vec<(Self::P, Self::VS)>>(),
58-
))
59-
}
60-
Ok(Dependencies::Unavailable(reason)) => Ok(Dependencies::Unavailable(reason)),
61-
Err(err) => Err(err),
62-
}
6354
}
6455

6556
fn choose_version(&self, package: &DP::P, range: &DP::VS) -> Result<Option<DP::V>, DP::Err> {

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
//! # use pubgrub::solver::{DependencyProvider, Dependencies};
7474
//! # use pubgrub::version::SemanticVersion;
7575
//! # use pubgrub::range::Range;
76-
//! # use pubgrub::type_aliases::Map;
76+
//! # use pubgrub::type_aliases::{DependencyConstraints, Map};
7777
//! # use std::error::Error;
7878
//! # use std::borrow::Borrow;
7979
//! # use std::convert::Infallible;
@@ -96,8 +96,8 @@
9696
//! &self,
9797
//! package: &String,
9898
//! version: &SemanticVersion,
99-
//! ) -> Result<Dependencies<impl IntoIterator<Item = (String, SemVS)> + Clone, Self::M>, Infallible> {
100-
//! Ok(Dependencies::Available([]))
99+
//! ) -> Result<Dependencies<DependencyConstraints<String, SemVS>, Self::M>, Infallible> {
100+
//! Ok(Dependencies::Available(DependencyConstraints::default()))
101101
//! }
102102
//!
103103
//! type Err = Infallible;

src/solver.rs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ use crate::error::PubGrubError;
7171
use crate::internal::core::State;
7272
use crate::internal::incompatibility::Incompatibility;
7373
use crate::package::Package;
74-
use crate::type_aliases::{Map, SelectedDependencies};
74+
use crate::type_aliases::{DependencyConstraints, Map, SelectedDependencies};
7575
use crate::version_set::VersionSet;
7676
use log::{debug, info};
7777

@@ -280,10 +280,7 @@ pub trait DependencyProvider {
280280
&self,
281281
package: &Self::P,
282282
version: &Self::V,
283-
) -> Result<
284-
Dependencies<impl IntoIterator<Item = (Self::P, Self::VS)> + Clone, Self::M>,
285-
Self::Err,
286-
>;
283+
) -> Result<Dependencies<DependencyConstraints<Self::P, Self::VS>, Self::M>, Self::Err>;
287284

288285
/// This is called fairly regularly during the resolution,
289286
/// if it returns an Err then resolution will be terminated.
@@ -357,8 +354,8 @@ impl<P: Package, VS: VersionSet> OfflineDependencyProvider<P, VS> {
357354

358355
/// Lists dependencies of a given package and version.
359356
/// Returns [None] if no information is available regarding that package and version pair.
360-
fn dependencies(&self, package: &P, version: &VS::V) -> Option<&Map<P, VS>> {
361-
self.dependencies.get(package)?.get(version)
357+
fn dependencies(&self, package: &P, version: &VS::V) -> Option<DependencyConstraints<P, VS>> {
358+
self.dependencies.get(package)?.get(version).cloned()
362359
}
363360
}
364361

@@ -396,17 +393,12 @@ impl<P: Package, VS: VersionSet> DependencyProvider for OfflineDependencyProvide
396393
&self,
397394
package: &P,
398395
version: &VS::V,
399-
) -> Result<
400-
Dependencies<impl IntoIterator<Item = (Self::P, Self::VS)> + Clone, Self::M>,
401-
Self::Err,
402-
> {
396+
) -> Result<Dependencies<DependencyConstraints<Self::P, Self::VS>, Self::M>, Self::Err> {
403397
Ok(match self.dependencies(package, version) {
404398
None => {
405399
Dependencies::Unavailable("its dependencies could not be determined".to_string())
406400
}
407-
Some(dependencies) => {
408-
Dependencies::Available(dependencies.iter().map(|(p, vs)| (p.clone(), vs.clone())))
409-
}
401+
Some(dependencies) => Dependencies::Available(dependencies),
410402
})
411403
}
412404
}

src/type_aliases.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ pub type Set<V> = rustc_hash::FxHashSet<V>;
1414
pub type SelectedDependencies<DP> =
1515
Map<<DP as DependencyProvider>::P, <DP as DependencyProvider>::V>;
1616

17+
/// Holds information about all possible versions a given package can accept.
18+
/// There is a difference in semantics between an empty map
19+
/// inside [DependencyConstraints] and [Dependencies::Unavailable](crate::solver::Dependencies::Unavailable):
20+
/// the former means the package has no dependency and it is a known fact,
21+
/// while the latter means they could not be fetched by the [DependencyProvider].
22+
pub type DependencyConstraints<P, VS> = Map<P, VS>;
23+
1724
pub(crate) type IncompDpId<DP> = IncompId<
1825
<DP as DependencyProvider>::P,
1926
<DP as DependencyProvider>::VS,

tests/proptest.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use pubgrub::package::Package;
1111
use pubgrub::range::Range;
1212
use pubgrub::report::{DefaultStringReporter, DerivationTree, External, Reporter};
1313
use pubgrub::solver::{resolve, Dependencies, DependencyProvider, OfflineDependencyProvider};
14-
use pubgrub::type_aliases::SelectedDependencies;
14+
use pubgrub::type_aliases::{DependencyConstraints, SelectedDependencies};
1515
#[cfg(feature = "serde")]
1616
use pubgrub::version::SemanticVersion;
1717
use pubgrub::version_set::VersionSet;
@@ -37,7 +37,7 @@ impl<P: Package, VS: VersionSet> DependencyProvider for OldestVersionsDependency
3737
&self,
3838
p: &P,
3939
v: &VS::V,
40-
) -> Result<Dependencies<impl IntoIterator<Item = (P, VS)> + Clone, Self::M>, Infallible> {
40+
) -> Result<Dependencies<DependencyConstraints<Self::P, Self::VS>, Self::M>, Infallible> {
4141
self.0.get_dependencies(p, v)
4242
}
4343

@@ -90,8 +90,7 @@ impl<DP: DependencyProvider> DependencyProvider for TimeoutDependencyProvider<DP
9090
&self,
9191
p: &DP::P,
9292
v: &DP::V,
93-
) -> Result<Dependencies<impl IntoIterator<Item = (DP::P, DP::VS)> + Clone, DP::M>, DP::Err>
94-
{
93+
) -> Result<Dependencies<DependencyConstraints<DP::P, DP::VS>, DP::M>, DP::Err> {
9594
self.dp.get_dependencies(p, v)
9695
}
9796

0 commit comments

Comments
 (0)