melodium_common/descriptor/
identifier_requirement.rs1use 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}