Skip to main content

runmat_package/lock/
canonical.rs

1use super::model::PackageLock;
2use super::validate::{canonicalized, validate_lock};
3use crate::LockError;
4
5pub fn encode_lock(lock: &PackageLock) -> Result<String, LockError> {
6    validate_lock(lock)?;
7    let canonical = canonicalized(lock.clone());
8    let mut encoded = toml::to_string(&canonical)?;
9    if !encoded.ends_with('\n') {
10        encoded.push('\n');
11    }
12    Ok(encoded)
13}
14
15pub fn decode_lock(input: &str) -> Result<PackageLock, LockError> {
16    let lock: PackageLock = toml::from_str(input)?;
17    validate_lock(&lock)?;
18    if lock != canonicalized(lock.clone()) {
19        return Err(LockError::Invalid(
20            "package and edge records are not in canonical order".to_string(),
21        ));
22    }
23    Ok(lock)
24}