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 { kind: *e.kind() }),
62 }
63 } else {
64 match SemverVersion::parse(s) {
65 Ok(version) => Ok(SchemaVersion(version)),
66 Err(e) => Err(Error::InvalidSemver {
67 kind: e.to_string(),
68 }),
69 }
70 }
71 }
72}
73
74impl Display for SchemaVersion {
75 fn fmt(&self, fmt: &mut Formatter) -> std::fmt::Result {
76 write!(fmt, "{}", self.0)
77 }
78}
79
80#[cfg(test)]
81mod tests {
82 use rstest::rstest;
83
84 use super::*;
85
86 #[rstest]
87 #[case("1.0.0", Ok(SchemaVersion(SemverVersion::new(1, 0, 0))))]
88 #[case("1", Ok(SchemaVersion(SemverVersion::new(1, 0, 0))))]
89 #[case("-1.0.0", Err(Error::InvalidSemver { kind: String::from("unexpected character '-' while parsing major version number") }))]
90 fn schema_version(#[case] version: &str, #[case] result: Result<SchemaVersion, Error>) {
91 assert_eq!(result, SchemaVersion::from_str(version))
92 }
93
94 #[rstest]
95 #[case(
96 SchemaVersion(SemverVersion::new(1, 0, 0)),
97 SchemaVersion(SemverVersion::new(0, 1, 0))
98 )]
99 fn compare_schema_version(#[case] version_a: SchemaVersion, #[case] version_b: SchemaVersion) {
100 assert!(version_a > version_b);
101 }
102}