|
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(&mut 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(&mut 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 | | - &mut 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