uv_resolver/
resolution_mode.rs

1use crate::resolver::{ForkMap, ForkSet};
2use crate::{DependencyMode, Manifest, ResolverEnvironment};
3
4#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
5#[serde(deny_unknown_fields, rename_all = "kebab-case")]
6#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
7#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
8pub enum ResolutionMode {
9    /// Resolve the highest compatible version of each package.
10    #[default]
11    Highest,
12    /// Resolve the lowest compatible version of each package.
13    Lowest,
14    /// Resolve the lowest compatible version of any direct dependencies, and the highest
15    /// compatible version of any transitive dependencies.
16    LowestDirect,
17}
18
19impl std::fmt::Display for ResolutionMode {
20    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21        match self {
22            Self::Highest => write!(f, "highest"),
23            Self::Lowest => write!(f, "lowest"),
24            Self::LowestDirect => write!(f, "lowest-direct"),
25        }
26    }
27}
28
29/// Like [`ResolutionMode`], but with any additional information required to select a candidate,
30/// like the set of direct dependencies.
31#[derive(Debug, Clone)]
32pub(crate) enum ResolutionStrategy {
33    /// Resolve the highest compatible version of each package.
34    Highest,
35    /// Resolve the lowest compatible version of each package.
36    Lowest,
37    /// Resolve the lowest compatible version of any direct dependencies, and the highest
38    /// compatible version of any transitive dependencies.
39    LowestDirect(ForkSet),
40}
41
42impl ResolutionStrategy {
43    pub(crate) fn from_mode(
44        mode: ResolutionMode,
45        manifest: &Manifest,
46        env: &ResolverEnvironment,
47        dependencies: DependencyMode,
48    ) -> Self {
49        match mode {
50            ResolutionMode::Highest => Self::Highest,
51            ResolutionMode::Lowest => Self::Lowest,
52            ResolutionMode::LowestDirect => {
53                let mut first_party = ForkMap::default();
54                for requirement in manifest.user_requirements(env, dependencies) {
55                    first_party.add(&requirement, ());
56                }
57                Self::LowestDirect(first_party)
58            }
59        }
60    }
61}