#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum RegfVersion {
V1_0,
V1_3,
V1_4,
V1_5,
V1_6,
}
impl RegfVersion {
pub fn from_minor(minor: u32) -> Option<Self> {
match minor {
0..=2 => Some(Self::V1_0),
3 => Some(Self::V1_3),
4 => Some(Self::V1_4),
5 => Some(Self::V1_5),
6 => Some(Self::V1_6),
_ => None,
}
}
pub fn has_hash_leaf(self) -> bool {
self >= Self::V1_5
}
pub fn has_big_data(self) -> bool {
self >= Self::V1_4
}
pub fn has_fast_leaf(self) -> bool {
self >= Self::V1_3
}
pub fn has_layered_keys(self) -> bool {
self >= Self::V1_6
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn version_from_minor() {
assert_eq!(RegfVersion::from_minor(0), Some(RegfVersion::V1_0));
assert_eq!(RegfVersion::from_minor(2), Some(RegfVersion::V1_0));
assert_eq!(RegfVersion::from_minor(3), Some(RegfVersion::V1_3));
assert_eq!(RegfVersion::from_minor(5), Some(RegfVersion::V1_5));
assert_eq!(RegfVersion::from_minor(6), Some(RegfVersion::V1_6));
assert_eq!(RegfVersion::from_minor(99), None);
}
#[test]
fn version_feature_gates() {
assert!(!RegfVersion::V1_0.has_fast_leaf());
assert!(RegfVersion::V1_3.has_fast_leaf());
assert!(!RegfVersion::V1_3.has_big_data());
assert!(RegfVersion::V1_4.has_big_data());
assert!(!RegfVersion::V1_4.has_hash_leaf());
assert!(RegfVersion::V1_5.has_hash_leaf());
assert!(RegfVersion::V1_6.has_layered_keys());
}
#[test]
fn versions_are_ordered() {
assert!(RegfVersion::V1_0 < RegfVersion::V1_3);
assert!(RegfVersion::V1_3 < RegfVersion::V1_5);
assert!(RegfVersion::V1_5 < RegfVersion::V1_6);
}
}