melodium_common/descriptor/
identifier_requirement.rs

1use crate::descriptor::{Identifier, PackageRequirement, VersionReq};
2use core::fmt::{Display, Formatter};
3
4#[derive(Clone, Debug)]
5pub struct IdentifierRequirement {
6    version_requirement: VersionReq,
7    path: Vec<String>,
8    name: String,
9}
10
11impl IdentifierRequirement {
12    pub fn new(version_requirement: VersionReq, path: Vec<String>, name: &str) -> Self {
13        if path.is_empty() {
14            panic!("Identifier path cannot be empty.")
15        }
16
17        Self {
18            version_requirement,
19            path,
20            name: name.to_string(),
21        }
22    }
23
24    pub fn new_with_identifier(version_requirement: VersionReq, identifier: &Identifier) -> Self {
25        Self {
26            version_requirement,
27            path: identifier.path().clone(),
28            name: identifier.name().to_string(),
29        }
30    }
31
32    pub fn version_requirement(&self) -> &VersionReq {
33        &self.version_requirement
34    }
35
36    pub fn root(&self) -> &String {
37        &self.path.first().unwrap()
38    }
39
40    pub fn path(&self) -> &Vec<String> {
41        &self.path
42    }
43
44    pub fn name(&self) -> &str {
45        &self.name
46    }
47
48    pub fn to_identifier(&self) -> Identifier {
49        Identifier::new(self.path.clone(), &self.name)
50    }
51
52    pub fn package_requirement(&self) -> PackageRequirement {
53        PackageRequirement::new(self.root(), &self.version_requirement)
54    }
55
56    pub fn matches(&self, id: &Identifier) -> bool {
57        if let Some(version) = id.version() {
58            if &self.path == id.path()
59                && &self.name == id.name()
60                && self.version_requirement.matches(version)
61            {
62                true
63            } else {
64                false
65            }
66        } else {
67            false
68        }
69    }
70}
71
72impl From<&Identifier> for IdentifierRequirement {
73    fn from(value: &Identifier) -> Self {
74        IdentifierRequirement::new(
75            value
76                .version()
77                .map(|v| VersionReq {
78                    comparators: vec![semver::Comparator {
79                        op: semver::Op::Exact,
80                        major: v.major,
81                        minor: Some(v.minor),
82                        patch: Some(v.patch),
83                        pre: v.pre.clone(),
84                    }],
85                })
86                .unwrap_or_default(),
87            value.path().clone(),
88            value.name(),
89        )
90    }
91}
92
93impl From<Identifier> for IdentifierRequirement {
94    fn from(value: Identifier) -> Self {
95        Self::from(&value)
96    }
97}
98
99impl Display for IdentifierRequirement {
100    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
101        let mut string = self.path.join("/");
102
103        string = string + "::" + &self.name;
104
105        write!(f, "{} ({})", string, self.version_requirement)
106    }
107}