use super::Span;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PolicyVerb {
Allow,
Deny,
Warn,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PolicyEntry {
pub verb: PolicyVerb,
pub code: String,
pub source_span: Option<Span>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct DiagnosticPolicy {
pub entries: Vec<PolicyEntry>,
}
impl DiagnosticPolicy {
pub fn verb_for(&self, code: &str) -> Option<&PolicyVerb> {
self.entries
.iter()
.rev()
.find(|e| e.code == code)
.map(|e| &e.verb)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn entry(verb: PolicyVerb, code: &str) -> PolicyEntry {
PolicyEntry {
verb,
code: code.to_owned(),
source_span: None,
}
}
#[test]
fn default_policy_is_empty_and_inert() {
let p = DiagnosticPolicy::default();
assert!(p.entries.is_empty());
assert_eq!(p.verb_for("anything"), None);
}
#[test]
fn verb_for_returns_the_governing_verb() {
let p = DiagnosticPolicy {
entries: vec![entry(PolicyVerb::Allow, "layout.off_canvas")],
};
assert_eq!(p.verb_for("layout.off_canvas"), Some(&PolicyVerb::Allow));
assert_eq!(p.verb_for("token.unused"), None);
}
#[test]
fn verb_for_is_last_wins() {
let p = DiagnosticPolicy {
entries: vec![
entry(PolicyVerb::Deny, "node.unknown_property"),
entry(PolicyVerb::Warn, "node.unknown_property"),
],
};
assert_eq!(p.verb_for("node.unknown_property"), Some(&PolicyVerb::Warn));
}
}