Skip to main content

semver_common/models/
change_list.rs

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