creeper 1.0.0-alpha.9

Minecraft Package Manager
use std::collections::HashMap;

use semver::VersionReq;
use serde::{Deserialize, Serialize};
use serde_with::{DisplayFromStr, serde_as};
use url::Url;

use crate::{Id, index::VersionRev};

#[serde_as]
#[derive(Clone, Serialize, Deserialize)]
pub struct Lock {
    pub registry: Url,
    #[serde_as(as = "HashMap<_, DisplayFromStr>")]
    pub package: HashMap<Id, VersionRev>,
}

impl Lock {
    pub fn satisfies(&self, req: impl IntoIterator<Item = (Id, VersionReq)>) -> bool {
        for (id, req) in req {
            if !self
                .package
                .get(&id)
                .is_some_and(|v| req.matches(&v.version))
            {
                return false;
            }
        }
        true
    }
}