update_informer/
package.rs

1use crate::{Result, Version};
2use std::fmt::{Display, Formatter};
3
4/// A package representation.
5#[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    /// Returns a name suitable for storing on filesystem, that will include
36    /// owner if it is set.
37    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    /// Returns the parsed version of the package
43    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}