update_informer/
version.rs

1use crate::Result;
2use std::fmt::{Display, Formatter};
3
4/// A version representation.
5#[derive(Debug, Clone, PartialEq, PartialOrd, Eq)]
6pub struct Version(semver::Version);
7
8impl Version {
9    pub(crate) fn parse<V: AsRef<str>>(value: V) -> Result<Self> {
10        let value = value.as_ref();
11        let v = value.strip_prefix('v').unwrap_or(value);
12        let version = semver::Version::parse(v)?;
13
14        Ok(Self(version))
15    }
16
17    /// Returns `semver::Version`.
18    pub fn semver(&self) -> &semver::Version {
19        &self.0
20    }
21}
22
23impl Display for Version {
24    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
25        write!(f, "v{}", self.0)
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use crate::Version;
32
33    #[test]
34    fn parse_str_version_test() {
35        let version1 = Version::parse("0.1.0");
36        let version2 = Version {
37            0: semver::Version {
38                major: 0,
39                minor: 1,
40                patch: 0,
41                pre: Default::default(),
42                build: Default::default(),
43            },
44        };
45
46        assert!(version1.is_ok());
47        assert_eq!(version1.unwrap(), version2);
48    }
49
50    #[test]
51    fn parse_string_version_test() {
52        let version1 = Version::parse(String::from("0.1.0"));
53        let version2 = Version {
54            0: semver::Version {
55                major: 0,
56                minor: 1,
57                patch: 0,
58                pre: Default::default(),
59                build: Default::default(),
60            },
61        };
62
63        assert!(version1.is_ok());
64        assert_eq!(version1.unwrap(), version2);
65    }
66
67    #[test]
68    fn parse_amp_string_version_test() {
69        let version1 = Version::parse(&String::from("0.1.0"));
70        let version2 = Version {
71            0: semver::Version {
72                major: 0,
73                minor: 1,
74                patch: 0,
75                pre: Default::default(),
76                build: Default::default(),
77            },
78        };
79
80        assert!(version1.is_ok());
81        assert_eq!(version1.unwrap(), version2);
82    }
83
84    #[test]
85    fn parse_version_with_prefix_test() {
86        let version1 = Version::parse("v0.1.0");
87        let version2 = Version {
88            0: semver::Version {
89                major: 0,
90                minor: 1,
91                patch: 0,
92                pre: Default::default(),
93                build: Default::default(),
94            },
95        };
96
97        assert!(version1.is_ok());
98        assert_eq!(version1.unwrap(), version2);
99    }
100
101    #[test]
102    fn fmt_test() {
103        let version = Version::parse("0.1.0");
104        assert!(version.is_ok());
105        assert_eq!(String::from("v0.1.0"), format!("{}", version.unwrap()))
106    }
107
108    #[test]
109    fn semver_test() {
110        let version = Version::parse("0.1.0-canary");
111        assert!(version.is_ok());
112
113        let version = version.unwrap();
114        assert_eq!(version.semver().pre.to_string(), "canary");
115    }
116}