use crabka_metadata::MetadataImage;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum TxnVersion {
Classic,
Flexible,
Verified,
}
impl TxnVersion {
pub(crate) fn flexible_records(self) -> bool {
matches!(self, TxnVersion::Flexible | TxnVersion::Verified)
}
pub(crate) fn verified(self) -> bool {
matches!(self, TxnVersion::Verified)
}
}
pub(crate) fn resolve_txn_version(image: &MetadataImage) -> TxnVersion {
match image.finalized_feature(crabka_metadata::transaction_version::TRANSACTION_VERSION_FEATURE)
{
Some(2) => TxnVersion::Verified,
Some(1) => TxnVersion::Flexible,
_ => TxnVersion::Classic,
}
}
#[cfg(test)]
mod tests {
use super::*;
use assert2::assert;
use crabka_metadata::{FeatureLevelRecord, MetadataRecord};
fn image_with_tv(level: Option<i16>) -> MetadataImage {
let mut m = MetadataImage::new(uuid::Uuid::nil());
if let Some(l) = level {
m.apply(&MetadataRecord::V1FeatureLevel(FeatureLevelRecord {
name: "transaction.version".into(),
level: l,
}));
}
m
}
#[test]
fn resolves_levels() {
assert!(resolve_txn_version(&image_with_tv(None)) == TxnVersion::Classic);
assert!(resolve_txn_version(&image_with_tv(Some(0))) == TxnVersion::Classic);
assert!(resolve_txn_version(&image_with_tv(Some(1))) == TxnVersion::Flexible);
assert!(resolve_txn_version(&image_with_tv(Some(2))) == TxnVersion::Verified);
}
#[test]
fn behavior_predicates() {
assert!(!TxnVersion::Classic.flexible_records());
assert!(TxnVersion::Flexible.flexible_records());
assert!(TxnVersion::Verified.flexible_records());
assert!(!TxnVersion::Flexible.verified());
assert!(TxnVersion::Verified.verified());
}
}