File: version.rs

package info (click to toggle)
rust-breezyshim 0.7.8-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 996 kB
  • sloc: makefile: 2
file content (118 lines) | stat: -rw-r--r-- 3,074 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//! Version information for the Breezy library.
use pyo3::prelude::*;

/// The release level of a version.
///
/// This enum represents the different stages of a software release.
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum ReleaseLevel {
    /// Development version.
    Dev,
    /// Alpha version.
    Alpha,
    /// Beta version.
    Beta,
    /// Release candidate.
    Candidate,
    /// Final release.
    Final,
}

/// Version information.
///
/// This struct represents a version number with major, minor, and micro components,
/// a release level, and a serial number.
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Version {
    /// The major version number.
    major: u32,
    /// The minor version number.
    minor: u32,
    /// The micro (patch) version number.
    micro: u32,
    /// The release level.
    level: ReleaseLevel,
    /// The serial number within the release level.
    serial: u32,
}

impl std::fmt::Display for Version {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(
            f,
            "{}.{}.{}{}{}",
            self.major,
            self.minor,
            self.micro,
            match self.level {
                ReleaseLevel::Dev => "dev",
                ReleaseLevel::Alpha => "a",
                ReleaseLevel::Beta => "b",
                ReleaseLevel::Candidate => "rc",
                ReleaseLevel::Final => "",
            },
            if self.serial > 0 {
                format!("{}", self.serial)
            } else {
                "".to_string()
            }
        )
    }
}

/// Get the version of the Breezy library.
///
/// # Returns
///
/// The version of the Breezy library.
pub fn version() -> Version {
    Python::attach(|py| {
        let m = py.import("breezy").unwrap();

        let version_info = m.getattr("version_info").unwrap();

        let major = version_info.get_item(0).unwrap().extract::<u32>().unwrap();
        let minor = version_info.get_item(1).unwrap().extract::<u32>().unwrap();
        let micro = version_info.get_item(2).unwrap().extract::<u32>().unwrap();
        let level = match version_info
            .get_item(3)
            .unwrap()
            .extract::<String>()
            .unwrap()
            .as_str()
        {
            "dev" => ReleaseLevel::Dev,
            "alpha" => ReleaseLevel::Alpha,
            "beta" => ReleaseLevel::Beta,
            "candidate" => ReleaseLevel::Candidate,
            "final" => ReleaseLevel::Final,
            _ => panic!("Invalid release level"),
        };
        let serial = version_info.get_item(4).unwrap().extract::<u32>().unwrap();

        Version {
            major,
            minor,
            micro,
            level,
            serial,
        }
    })
}

#[test]
fn test_version_serialize() {
    let v = Version {
        major: 1,
        minor: 2,
        micro: 3,
        level: ReleaseLevel::Final,
        serial: 0,
    };
    assert_eq!(v.to_string(), "1.2.3");
}

#[test]
fn test_version() {
    version().to_string();
}