alpm_types/version/
schema.rs1use std::{
4 fmt::{Display, Formatter},
5 str::FromStr,
6};
7
8use semver::Version as SemverVersion;
9
10use crate::Error;
11
12#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
37pub struct SchemaVersion(SemverVersion);
38
39impl SchemaVersion {
40 pub fn new(version: SemverVersion) -> Self {
42 SchemaVersion(version)
43 }
44}
45
46impl AsRef<SemverVersion> for SchemaVersion {
47 fn as_ref(&self) -> &SemverVersion {
49 &self.0
50 }
51}
52
53impl FromStr for SchemaVersion {
54 type Err = Error;
55 fn from_str(s: &str) -> Result<SchemaVersion, Self::Err> {
60 if !s.contains('.') {
61 match s.parse() {
62 Ok(major) => Ok(SchemaVersion(SemverVersion::new(major, 0, 0))),
63 Err(e) => Err(Error::InvalidInteger { kind: *e.kind() }),
64 }
65 } else {
66 match SemverVersion::parse(s) {
67 Ok(version) => Ok(SchemaVersion(version)),
68 Err(e) => Err(Error::InvalidSemver {
69 kind: e.to_string(),
70 }),
71 }
72 }
73 }
74}
75
76impl Display for SchemaVersion {
77 fn fmt(&self, fmt: &mut Formatter) -> std::fmt::Result {
78 write!(fmt, "{}", self.0)
79 }
80}
81
82#[cfg(test)]
83mod tests {
84 use rstest::rstest;
85 use testresult::TestResult;
86
87 use super::*;
88
89 #[rstest]
90 #[case::full("1.0.0")]
91 #[case::simple("1")]
92 fn schema_version_from_str_succeeds(#[case] input: &str) -> TestResult {
93 let _ = SchemaVersion::from_str(input)?;
94
95 Ok(())
96 }
97
98 #[test]
99 fn schema_version_from_str_fails_on_invalid_semver() -> TestResult {
100 let Err(Error::InvalidSemver { .. }) = SchemaVersion::from_str("-1.0.0") else {
101 panic!("Expected to fail with Error::InvalidSemver");
102 };
103
104 Ok(())
105 }
106
107 #[test]
108 fn schema_version_from_str_fails_on_invalid_integer() -> TestResult {
109 let Err(Error::InvalidInteger { .. }) = SchemaVersion::from_str("foo") else {
110 panic!("Expected to fail with Error::InvalidInteger");
111 };
112
113 Ok(())
114 }
115
116 #[rstest]
117 #[case(
118 SchemaVersion(SemverVersion::new(1, 0, 0)),
119 SchemaVersion(SemverVersion::new(0, 1, 0))
120 )]
121 fn compare_schema_version(#[case] version_a: SchemaVersion, #[case] version_b: SchemaVersion) {
122 assert!(version_a > version_b);
123 }
124}