#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Detected<V> {
Declared(V),
Inferred(V),
Conflict {
declared: V,
observed: V,
},
}
impl<V: Copy> Detected<V> {
#[must_use]
pub fn resolved(&self) -> Option<V> {
match self {
Detected::Declared(v) | Detected::Inferred(v) => Some(*v),
Detected::Conflict { .. } => None,
}
}
#[must_use]
pub fn is_conflict(&self) -> bool {
matches!(self, Detected::Conflict { .. })
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn conflict_refuses_to_resolve_itself() {
assert_eq!(Detected::Declared(3u8).resolved(), Some(3));
assert_eq!(Detected::Inferred(3u8).resolved(), Some(3));
let conflict = Detected::Conflict {
declared: 2u8,
observed: 3,
};
assert_eq!(conflict.resolved(), None);
assert!(conflict.is_conflict());
}
#[test]
fn agreement_is_not_a_conflict() {
assert!(!Detected::Declared(1u8).is_conflict());
assert!(!Detected::Inferred(1u8).is_conflict());
}
}