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