Skip to main content

runmat_package/lock/
path.rs

1use super::PackageLock;
2use crate::LockError;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub enum PathLockMode {
6    Live,
7    Locked,
8}
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
11#[serde(rename_all = "kebab-case")]
12pub enum PathLockDecision {
13    UseExisting,
14    WriteGenerated,
15}
16
17pub fn reconcile_path_lock(
18    generated: &PackageLock,
19    existing: Option<&PackageLock>,
20    mode: PathLockMode,
21) -> Result<PathLockDecision, LockError> {
22    generated.validate()?;
23    if let Some(existing) = existing {
24        existing.validate()?;
25        if existing == generated {
26            return Ok(PathLockDecision::UseExisting);
27        }
28    }
29    match mode {
30        PathLockMode::Live => Ok(PathLockDecision::WriteGenerated),
31        PathLockMode::Locked if existing.is_none() => Err(LockError::Incompatible(
32            "locked mode requires an existing runmat.lock".to_string(),
33        )),
34        PathLockMode::Locked => Err(LockError::Incompatible(
35            "runmat.lock is stale for the current path dependency contents or selection"
36                .to_string(),
37        )),
38    }
39}