melodium-common 0.10.1

Common Mélodium elements and traits
Documentation
use crate::descriptor::{Identifier, PackageRequirement, VersionReq};
use core::fmt::{Display, Formatter};

#[derive(Clone, Debug)]
pub struct IdentifierRequirement {
    version_requirement: VersionReq,
    path: Vec<String>,
    name: String,
}

impl IdentifierRequirement {
    pub fn new(version_requirement: VersionReq, path: Vec<String>, name: &str) -> Self {
        if path.is_empty() {
            panic!("Identifier path cannot be empty.")
        }

        Self {
            version_requirement,
            path,
            name: name.to_string(),
        }
    }

    pub fn new_with_identifier(version_requirement: VersionReq, identifier: &Identifier) -> Self {
        Self {
            version_requirement,
            path: identifier.path().clone(),
            name: identifier.name().to_string(),
        }
    }

    pub fn version_requirement(&self) -> &VersionReq {
        &self.version_requirement
    }

    pub fn root(&self) -> &String {
        &self.path.first().unwrap()
    }

    pub fn path(&self) -> &Vec<String> {
        &self.path
    }

    pub fn name(&self) -> &str {
        &self.name
    }

    pub fn to_identifier(&self) -> Identifier {
        Identifier::new(self.path.clone(), &self.name)
    }

    pub fn package_requirement(&self) -> PackageRequirement {
        PackageRequirement::new(self.root(), &self.version_requirement)
    }

    pub fn matches(&self, id: &Identifier) -> bool {
        if let Some(version) = id.version() {
            if &self.path == id.path()
                && &self.name == id.name()
                && self.version_requirement.matches(version)
            {
                true
            } else {
                false
            }
        } else {
            false
        }
    }
}

impl From<&Identifier> for IdentifierRequirement {
    fn from(value: &Identifier) -> Self {
        IdentifierRequirement::new(
            value
                .version()
                .map(|v| VersionReq {
                    comparators: vec![semver::Comparator {
                        op: semver::Op::Exact,
                        major: v.major,
                        minor: Some(v.minor),
                        patch: Some(v.patch),
                        pre: v.pre.clone(),
                    }],
                })
                .unwrap_or_default(),
            value.path().clone(),
            value.name(),
        )
    }
}

impl From<Identifier> for IdentifierRequirement {
    fn from(value: Identifier) -> Self {
        Self::from(&value)
    }
}

impl Display for IdentifierRequirement {
    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
        let mut string = self.path.join("/");

        string = string + "::" + &self.name;

        write!(f, "{} ({})", string, self.version_requirement)
    }
}