Skip to main content

runmat_package/lock/
compatibility.rs

1use super::PackageLock;
2use crate::LockError;
3use semver::{Version, VersionReq};
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct LockCompatibility {
7    pub runmat_version: Version,
8}
9
10impl LockCompatibility {
11    pub fn validate(&self, lock: &PackageLock) -> Result<(), LockError> {
12        lock.validate()?;
13        for package in &lock.packages {
14            let Some(requirement) = package.runmat_version.as_deref() else {
15                continue;
16            };
17            let requirement = VersionReq::parse(requirement).map_err(|error| {
18                LockError::Invalid(format!(
19                    "package {} has invalid RunMat requirement `{requirement}`: {error}",
20                    package.instance.package
21                ))
22            })?;
23            if !requirement.matches(&self.runmat_version) {
24                return Err(LockError::Incompatible(format!(
25                    "package {} requires RunMat {requirement}, current version is {}",
26                    package.instance.package, self.runmat_version
27                )));
28            }
29        }
30        Ok(())
31    }
32}