runmat_package/lock/
path.rs1use 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}