gitmoji_changelog/
version.rs1use 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, pub semver: Option<semver::Version>, 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}