use crate::CommitMap;
use derive_getters::Getters;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Getters)]
pub struct Version {
major: u32,
minor: u32,
patch: u32,
changes: CommitMap,
}
impl Default for Version {
fn default() -> Self {
Self::new(0, 0, 0, CommitMap::new())
}
}
impl Version {
pub fn get(&self) -> String {
format!("v{}.{}.{}", self.major, self.minor, self.patch)
}
pub fn parse(version: &str) -> Option<(u32, u32, u32)> {
if version.len() <= 1 {
return None;
}
let separated: Vec<&str> = version[1..].split(".").collect();
if separated.len() == 3 {
let major_version = separated.first()?;
let minor_version = separated.get(1)?;
let patch_version = separated.get(2)?;
return Some((
major_version.parse().ok()?,
minor_version.parse().ok()?,
patch_version.parse().ok()?,
));
}
None
}
pub fn new(major: u32, minor: u32, patch: u32, changes: CommitMap) -> Self {
Version {
major,
minor,
patch,
changes,
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_version_parse_valid() {
let parse_value = Version::parse("v1.9.2");
assert_eq!(parse_value, Some((1, 9, 2)));
}
#[test]
fn test_version_parse_invalid_full_len() {
let parse_value = Version::parse("oopasdf91.9.2ff");
assert_eq!(parse_value, None);
}
#[test]
fn test_version_parse_invalid_one_len() {
let parse_value = Version::parse("v");
assert_eq!(parse_value, None);
}
#[test]
fn test_version_parse_invalid_no_input() {
let parse_value = Version::parse("");
assert_eq!(parse_value, None);
}
#[test]
fn test_version_parse_invalid_no_int() {
let parse_value = Version::parse("vIU.AB.PE");
assert_eq!(parse_value, None);
}
#[test]
fn test_version_get() {
let (major, minor, patch) = Version::parse("v1.9.2").unwrap();
let changes = CommitMap::new();
let version = Version::new(major, minor, patch, changes);
assert_eq!(version.get(), "v1.9.2");
}
}