|
59 | 59 | //! to satisfy the dependencies of that package and version pair.
|
60 | 60 | //! If there is no solution, the reason will be provided as clear as possible.
|
61 | 61 |
|
62 |
| -use std::cmp::Reverse; |
63 |
| -use std::collections::{BTreeMap, BTreeSet as Set}; |
64 |
| -use std::convert::Infallible; |
| 62 | +use std::collections::BTreeSet as Set; |
65 | 63 | use std::error::Error;
|
66 | 64 | use std::fmt::{Debug, Display};
|
67 | 65 |
|
@@ -244,7 +242,7 @@ pub trait DependencyProvider {
|
244 | 242 | /// The type returned from `prioritize`. The resolver does not care what type this is
|
245 | 243 | /// as long as it can pick a largest one and clone it.
|
246 | 244 | ///
|
247 |
| - /// [Reverse] can be useful if you want to pick the package with |
| 245 | + /// [`Reverse`](std::cmp::Reverse) can be useful if you want to pick the package with |
248 | 246 | /// the fewest versions that match the outstanding constraint.
|
249 | 247 | type Priority: Ord + Clone;
|
250 | 248 |
|
@@ -280,114 +278,3 @@ pub trait DependencyProvider {
|
280 | 278 | Ok(())
|
281 | 279 | }
|
282 | 280 | }
|
283 |
| - |
284 |
| -/// A basic implementation of [DependencyProvider]. |
285 |
| -#[derive(Debug, Clone, Default)] |
286 |
| -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] |
287 |
| -#[cfg_attr( |
288 |
| - feature = "serde", |
289 |
| - serde(bound( |
290 |
| - serialize = "VS::V: serde::Serialize, VS: serde::Serialize, P: serde::Serialize", |
291 |
| - deserialize = "VS::V: serde::Deserialize<'de>, VS: serde::Deserialize<'de>, P: serde::Deserialize<'de>" |
292 |
| - )) |
293 |
| -)] |
294 |
| -#[cfg_attr(feature = "serde", serde(transparent))] |
295 |
| -pub struct OfflineDependencyProvider<P: Package, VS: VersionSet> { |
296 |
| - dependencies: Map<P, BTreeMap<VS::V, DependencyConstraints<P, VS>>>, |
297 |
| -} |
298 |
| - |
299 |
| -impl<P: Package, VS: VersionSet> OfflineDependencyProvider<P, VS> { |
300 |
| - /// Creates an empty OfflineDependencyProvider with no dependencies. |
301 |
| - pub fn new() -> Self { |
302 |
| - Self { |
303 |
| - dependencies: Map::default(), |
304 |
| - } |
305 |
| - } |
306 |
| - |
307 |
| - /// Registers the dependencies of a package and version pair. |
308 |
| - /// Dependencies must be added with a single call to |
309 |
| - /// [add_dependencies](OfflineDependencyProvider::add_dependencies). |
310 |
| - /// All subsequent calls to |
311 |
| - /// [add_dependencies](OfflineDependencyProvider::add_dependencies) for a given |
312 |
| - /// package version pair will replace the dependencies by the new ones. |
313 |
| - /// |
314 |
| - /// The API does not allow to add dependencies one at a time to uphold an assumption that |
315 |
| - /// [OfflineDependencyProvider.get_dependencies(p, v)](OfflineDependencyProvider::get_dependencies) |
316 |
| - /// provides all dependencies of a given package (p) and version (v) pair. |
317 |
| - pub fn add_dependencies<I: IntoIterator<Item = (P, VS)>>( |
318 |
| - &mut self, |
319 |
| - package: P, |
320 |
| - version: impl Into<VS::V>, |
321 |
| - dependencies: I, |
322 |
| - ) { |
323 |
| - let package_deps = dependencies.into_iter().collect(); |
324 |
| - let v = version.into(); |
325 |
| - *self |
326 |
| - .dependencies |
327 |
| - .entry(package) |
328 |
| - .or_default() |
329 |
| - .entry(v) |
330 |
| - .or_default() = package_deps; |
331 |
| - } |
332 |
| - |
333 |
| - /// Lists packages that have been saved. |
334 |
| - pub fn packages(&self) -> impl Iterator<Item = &P> { |
335 |
| - self.dependencies.keys() |
336 |
| - } |
337 |
| - |
338 |
| - /// Lists versions of saved packages in sorted order. |
339 |
| - /// Returns [None] if no information is available regarding that package. |
340 |
| - pub fn versions(&self, package: &P) -> Option<impl Iterator<Item = &VS::V>> { |
341 |
| - self.dependencies.get(package).map(|k| k.keys()) |
342 |
| - } |
343 |
| - |
344 |
| - /// Lists dependencies of a given package and version. |
345 |
| - /// Returns [None] if no information is available regarding that package and version pair. |
346 |
| - fn dependencies(&self, package: &P, version: &VS::V) -> Option<DependencyConstraints<P, VS>> { |
347 |
| - self.dependencies.get(package)?.get(version).cloned() |
348 |
| - } |
349 |
| -} |
350 |
| - |
351 |
| -/// An implementation of [DependencyProvider] that |
352 |
| -/// contains all dependency information available in memory. |
353 |
| -/// Currently packages are picked with the fewest versions contained in the constraints first. |
354 |
| -/// But, that may change in new versions if better heuristics are found. |
355 |
| -/// Versions are picked with the newest versions first. |
356 |
| -impl<P: Package, VS: VersionSet> DependencyProvider for OfflineDependencyProvider<P, VS> { |
357 |
| - type P = P; |
358 |
| - type V = VS::V; |
359 |
| - type VS = VS; |
360 |
| - type M = String; |
361 |
| - |
362 |
| - type Err = Infallible; |
363 |
| - |
364 |
| - fn choose_version(&self, package: &P, range: &VS) -> Result<Option<VS::V>, Infallible> { |
365 |
| - Ok(self |
366 |
| - .dependencies |
367 |
| - .get(package) |
368 |
| - .and_then(|versions| versions.keys().rev().find(|v| range.contains(v)).cloned())) |
369 |
| - } |
370 |
| - |
371 |
| - type Priority = Reverse<usize>; |
372 |
| - fn prioritize(&self, package: &P, range: &VS) -> Self::Priority { |
373 |
| - Reverse( |
374 |
| - self.dependencies |
375 |
| - .get(package) |
376 |
| - .map(|versions| versions.keys().filter(|v| range.contains(v)).count()) |
377 |
| - .unwrap_or(0), |
378 |
| - ) |
379 |
| - } |
380 |
| - |
381 |
| - fn get_dependencies( |
382 |
| - &self, |
383 |
| - package: &P, |
384 |
| - version: &VS::V, |
385 |
| - ) -> Result<Dependencies<P, VS, Self::M>, Infallible> { |
386 |
| - Ok(match self.dependencies(package, version) { |
387 |
| - None => { |
388 |
| - Dependencies::Unavailable("its dependencies could not be determined".to_string()) |
389 |
| - } |
390 |
| - Some(dependencies) => Dependencies::Available(dependencies), |
391 |
| - }) |
392 |
| - } |
393 |
| -} |
0 commit comments