Skip to main content

semver_common/models/
change_list.rs

1use crate::{Change, Commit};
2use serde::{Deserialize, Serialize};
3
4/// Represents a list of change formats to use while analyzing commits.
5#[derive(Serialize, Deserialize, Debug)]
6pub struct ChangeList {
7    changes: Vec<Change>,
8}
9
10impl PartialEq for ChangeList {
11    fn eq(&self, other: &Self) -> bool {
12        if self.changes.len() != other.changes.len() {
13            return false;
14        }
15        for i in 0..self.changes.len() {
16            if self.changes[i] != other.changes[i] {
17                return false;
18            }
19        }
20        true
21    }
22}
23
24impl ChangeList {
25    pub fn new(changes: Vec<Change>) -> Self {
26        ChangeList { changes }
27    }
28
29    /// Checks a commit to see if it matches any of the changes in this list and returns the
30    /// kind of change it matched.
31    pub fn check(&self, commit: &Commit) -> Option<&Change> {
32        self.changes
33            .iter()
34            .find(|&change| change.check(commit).is_ok())
35            .map(|v| v as _)
36    }
37}
38
39#[cfg(test)]
40mod test {
41    use crate::mock;
42
43    #[test]
44    fn test_changelist_check_pattern_match_one() {
45        let changelist = mock::changelist::create();
46        let commit = mock::commit::create("feat(some_scope): the commit message");
47        let check = changelist.check(&commit);
48        assert_eq!(
49            check,
50            Some(&mock::change::create("^feat(\n|.)*$", "Feature", 2))
51        );
52    }
53
54    #[test]
55    fn test_changelist_check_pattern_match_two() {
56        let changelist = mock::changelist::create();
57        let commit = mock::commit::create("fix(some_scope): the commit message");
58        let check = changelist.check(&commit);
59        assert_eq!(check, Some(&mock::change::create("^fix(\n|.)*$", "Fix", 3)));
60    }
61
62    #[test]
63    fn test_changelist_check_pattern_not_match_one() {
64        let changelist = mock::changelist::create();
65        let commit = mock::commit::create("chore: this is a chore");
66        let check = changelist.check(&commit);
67        assert_eq!(check, None);
68    }
69
70    #[test]
71    fn test_changelist_check_pattern_not_match_two() {
72        let changelist = mock::changelist::create();
73        let commit = mock::commit::create("docs(readme): a test readme message");
74        let check = changelist.check(&commit);
75        assert_eq!(check, None);
76    }
77}