update_informer/
package.rs1use crate::{Result, Version};
2use std::fmt::{Display, Formatter};
3
4#[derive(Debug, PartialEq, Eq)]
6pub struct Package<'a> {
7 owner: Option<&'a str>,
8 name: &'a str,
9 version: Version,
10}
11
12impl<'a> Package<'a> {
13 pub(crate) fn new(name: &'a str, version: &'a str) -> Result<Self> {
14 let version = Version::parse(version)?;
15
16 let pkg = if !name.contains('/') {
17 Self {
18 owner: None,
19 name,
20 version,
21 }
22 } else {
23 let parts = name.split('/').collect::<Vec<_>>();
24
25 Self {
26 owner: Some(parts[0]),
27 name: parts[1],
28 version,
29 }
30 };
31
32 Ok(pkg)
33 }
34
35 pub(crate) fn name(&self) -> String {
38 let owner = self.owner.map(|s| format!("{s}-")).unwrap_or_default();
39 format!("{}{}", owner, self.name)
40 }
41
42 pub fn version(&self) -> &Version {
44 &self.version
45 }
46}
47
48impl Display for Package<'_> {
49 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
50 if self.owner.is_none() {
51 return write!(f, "{}", self.name);
52 }
53
54 write!(f, "{}/{}", self.owner.as_ref().unwrap(), self.name)
55 }
56}
57
58#[cfg(test)]
59mod tests {
60 use crate::{Package, Version};
61
62 const RAW_VERSION: &str = "1.0.0";
63
64 #[test]
65 fn new_with_name_test() {
66 let version = Version::parse(RAW_VERSION).expect("parse version");
67 let pkg1 = Package::new("repo", RAW_VERSION).unwrap();
68 let pkg2 = Package {
69 owner: None,
70 name: "repo",
71 version: version.clone(),
72 };
73
74 assert_eq!(pkg1, pkg2);
75 assert_eq!(pkg1.name(), "repo".to_string());
76 assert_eq!(pkg1.version(), &version);
77 }
78
79 #[test]
80 fn new_with_owner_and_name_test() {
81 let version = Version::parse(RAW_VERSION).expect("parse version");
82 let pkg1 = Package::new("owner/repo", RAW_VERSION).unwrap();
83 let pkg2 = Package {
84 owner: Some("owner"),
85 name: "repo",
86 version,
87 };
88
89 assert_eq!(pkg1, pkg2);
90 assert_eq!(pkg1.name(), "owner-repo".to_string());
91 }
92
93 #[test]
94 fn name_fmt_test() {
95 let pkg = Package::new("repo", RAW_VERSION).unwrap();
96 assert_eq!(String::from("repo"), format!("{}", pkg))
97 }
98
99 #[test]
100 fn name_with_owner_fmt_test() {
101 let pkg = Package::new("owner/repo", RAW_VERSION).unwrap();
102 assert_eq!(String::from("owner/repo"), format!("{}", pkg))
103 }
104}