use crate::parser::Commit;
use super::{Condition, NoOpts, Rule, Severity};
use miette::{miette, LabeledSpan, Report};
pub struct ScopeEmptyRule {
pub opts: NoOpts,
}
impl Rule for ScopeEmptyRule {
fn run(&self, commit: &Commit) -> Option<Report> {
let severity = &self.opts.0;
let condition = &self.opts.1;
if severity == &Severity::Off {
return None;
}
let is_valid = match condition {
Condition::Never => commit.scope.is_some(),
Condition::Always => commit.scope.is_none(),
};
let mut labels = None;
if let Some(scope) = &commit.scope {
labels = Some(vec![LabeledSpan::at(
scope.start()..scope.end(),
"not allowed scope",
)]);
}
if !is_valid {
return Some(
miette!(
severity = match severity {
Severity::Warning => miette::Severity::Warning,
Severity::Error => miette::Severity::Error,
Severity::Off => miette::Severity::Advice,
},
labels = labels.unwrap_or_default(),
help = String::from("scope")
+ match condition {
Condition::Never => " may not be empty",
Condition::Always => " must be empty",
},
code = "rule/scope-empty",
url = "https://example.com",
"Scope",
)
.with_source_code(commit.raw.clone()),
);
}
None
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_empty_scope() {
let mut commit: Commit<'_> = Default::default();
commit.scope = None;
let rule = ScopeEmptyRule {
opts: NoOpts(Severity::Error, Condition::Never),
};
assert!(rule.run(&commit).is_some());
let rule = ScopeEmptyRule {
opts: NoOpts(Severity::Error, Condition::Always),
};
assert!(rule.run(&commit).is_none());
}
#[test]
fn test_filled_scope() {
let mut commit: Commit<'_> = Default::default();
commit.scope = Some(Default::default());
let rule = ScopeEmptyRule {
opts: NoOpts(Severity::Error, Condition::Never),
};
assert!(rule.run(&commit).is_none());
let rule = ScopeEmptyRule {
opts: NoOpts(Severity::Error, Condition::Always),
};
assert!(rule.run(&commit).is_some());
}
#[test]
fn test_severity_off() {
let mut commit: Commit<'_> = Default::default();
commit.scope = Some(Default::default());
let rule = ScopeEmptyRule {
opts: NoOpts(Severity::Off, Condition::Never),
};
assert!(rule.run(&commit).is_none());
let rule = ScopeEmptyRule {
opts: NoOpts(Severity::Off, Condition::Always),
};
assert!(rule.run(&commit).is_none());
}
}