update_informer/
version.rs1use crate::Result;
2use std::fmt::{Display, Formatter};
3
4#[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 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}