gitmoji_changelog/
version.rs

1use std::cmp::Ordering;
2
3use regex::Regex;
4use semver;
5use serde::ser::{Serialize, SerializeStruct, Serializer};
6
7use crate::commit::Commit;
8use crate::group::Group;
9
10lazy_static! {
11    static ref RE_REMOVE_V: Regex = Regex::new(r"v?(.*)").unwrap();
12}
13
14#[derive(Eq, PartialEq, Debug, Clone)]
15pub struct Version {
16    pub name: String,                    // TODO: &str?
17    pub semver: Option<semver::Version>, // TODO: don't know if this is useful, except for sorting, I excluded it from JSON serialization
18    pub groups: Vec<Group>,
19}
20
21impl Serialize for Version {
22    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
23    where
24        S: Serializer,
25    {
26        let mut state = serializer.serialize_struct("Version", 2)?;
27        state.serialize_field("name", &self.name)?;
28        state.serialize_field("groups", &self.groups)?;
29        state.end()
30    }
31}
32
33impl Ord for Version {
34    fn cmp(&self, other: &Version) -> Ordering {
35        if self.semver.is_some() && other.semver.is_some() {
36            return self.semver.cmp(&other.semver);
37        }
38
39        self.name.cmp(&other.name)
40    }
41}
42
43impl PartialOrd for Version {
44    fn partial_cmp(&self, other: &Version) -> Option<Ordering> {
45        Some(self.cmp(other))
46    }
47}
48
49impl Version {
50    pub fn new(name: &str) -> Version {
51        let semver = match RE_REMOVE_V.captures(name) {
52            None => None,
53            Some(captures) => match captures.get(1) {
54                None => None,
55                Some(capture) => semver::Version::parse(capture.as_str()).ok(),
56            },
57        };
58
59        Version {
60            name: name.to_string(),
61            semver,
62            groups: vec![],
63        }
64    }
65
66    pub fn set_commits(&mut self, commits: Vec<Commit>) -> &mut Version {
67        self.groups = Group::from_commits(commits);
68
69        self
70    }
71
72    pub fn set_name(&mut self, name: &str) -> &mut Version {
73        self.name = name.to_string();
74
75        self
76    }
77}