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 pub fn inner(&self) -> &SemverVersion {
47 &self.0
48 }
49}
50
51impl FromStr for SchemaVersion {
52 type Err = Error;
53 fn from_str(s: &str) -> Result<SchemaVersion, Self::Err> {
58 if !s.contains('.') {
59 match s.parse() {
60 Ok(major) => Ok(SchemaVersion(SemverVersion::new(major, 0, 0))),
61 Err(e) => Err(Error::InvalidInteger {
62 kind: e.kind().clone(),
63 }),
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
86 use super::*;
87
88 #[rstest]
89 #[case("1.0.0", Ok(SchemaVersion(SemverVersion::new(1, 0, 0))))]
90 #[case("1", Ok(SchemaVersion(SemverVersion::new(1, 0, 0))))]
91 #[case("-1.0.0", Err(Error::InvalidSemver { kind: String::from("unexpected character '-' while parsing major version number") }))]
92 fn schema_version(#[case] version: &str, #[case] result: Result<SchemaVersion, Error>) {
93 assert_eq!(result, SchemaVersion::from_str(version))
94 }
95
96 #[rstest]
97 #[case(
98 SchemaVersion(SemverVersion::new(1, 0, 0)),
99 SchemaVersion(SemverVersion::new(0, 1, 0))
100 )]
101 fn compare_schema_version(#[case] version_a: SchemaVersion, #[case] version_b: SchemaVersion) {
102 assert!(version_a > version_b);
103 }
104}