Skip to main content

pray_core/
resolve_context.rs

1use crate::lockfile::Lockfile;
2use std::collections::BTreeSet;
3
4#[derive(Debug, Clone, Default, PartialEq, Eq)]
5pub struct ResolveOptions {
6    pub offline: bool,
7    pub unlocked_packages: BTreeSet<String>,
8    /// When true, git sources fetch remote HEAD instead of the revision pinned in Prayfile.lock.
9    pub refresh_source_revisions: bool,
10    /// When true, resolve against registry constraints instead of versions pinned in Prayfile.lock.
11    pub ignore_locked_versions: bool,
12    /// Selected render environment; does not change package resolution.
13    pub environment: Option<String>,
14}
15
16#[derive(Debug, Clone, Default, PartialEq, Eq)]
17pub struct PackageResolutionContext {
18    pub preferred_version: Option<String>,
19    pub offline: bool,
20}
21
22impl PackageResolutionContext {
23    pub fn from_lockfile(
24        lockfile: Option<&Lockfile>,
25        package_name: &str,
26        options: &ResolveOptions,
27    ) -> Self {
28        let preferred_version =
29            if options.ignore_locked_versions || options.unlocked_packages.contains(package_name) {
30                None
31            } else {
32                lockfile.and_then(|lockfile| {
33                    lockfile
34                        .package
35                        .iter()
36                        .find(|package| package.name == package_name)
37                        .map(|package| package.version.clone())
38                })
39            };
40        Self {
41            preferred_version,
42            offline: options.offline,
43        }
44    }
45}