use crate::{Change, Commit};
use derive_getters::Getters;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Getters)]
pub struct ChangeList {
changes: Vec<Change>,
}
impl PartialEq for ChangeList {
fn eq(&self, other: &Self) -> bool {
if self.changes.len() != other.changes.len() {
return false;
}
for i in 0..self.changes.len() {
if self.changes[i] != other.changes[i] {
return false;
}
}
true
}
}
impl ChangeList {
pub fn new(changes: Vec<Change>) -> Self {
ChangeList { changes }
}
pub fn check(&self, commit: &Commit) -> Option<&Change> {
self.changes
.iter()
.find(|&change| change.check(commit).is_ok())
.map(|v| v as _)
}
}
#[cfg(test)]
mod test {
use crate::mock;
#[test]
fn test_changelist_check_pattern_match_one() {
let changelist = mock::changelist::create();
let commit = mock::commit::create("feat(some_scope): the commit message");
let check = changelist.check(&commit);
assert_eq!(
check,
Some(&mock::change::create("^feat(\n|.)*$", "Feature", 2))
);
}
#[test]
fn test_changelist_check_pattern_match_two() {
let changelist = mock::changelist::create();
let commit = mock::commit::create("fix(some_scope): the commit message");
let check = changelist.check(&commit);
assert_eq!(check, Some(&mock::change::create("^fix(\n|.)*$", "Fix", 3)));
}
#[test]
fn test_changelist_check_pattern_not_match_one() {
let changelist = mock::changelist::create();
let commit = mock::commit::create("chore: this is a chore");
let check = changelist.check(&commit);
assert_eq!(check, None);
}
#[test]
fn test_changelist_check_pattern_not_match_two() {
let changelist = mock::changelist::create();
let commit = mock::commit::create("docs(readme): a test readme message");
let check = changelist.check(&commit);
assert_eq!(check, None);
}
}