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();
}
|