reifydb_core/key/
transaction_version.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use super::{EncodableKey, KeyKind};
5use crate::{
6	EncodedKey,
7	util::encoding::keycode::{KeyDeserializer, KeySerializer},
8};
9
10#[derive(Debug, Clone, PartialEq)]
11pub struct TransactionVersionKey {}
12
13const VERSION: u8 = 1;
14
15impl EncodableKey for TransactionVersionKey {
16	const KIND: KeyKind = KeyKind::TransactionVersion;
17
18	fn encode(&self) -> EncodedKey {
19		let mut serializer = KeySerializer::with_capacity(2);
20		serializer.extend_u8(VERSION).extend_u8(Self::KIND as u8);
21		serializer.to_encoded_key()
22	}
23
24	fn decode(key: &EncodedKey) -> Option<Self> {
25		let mut de = KeyDeserializer::from_bytes(key.as_slice());
26
27		let version = de.read_u8().ok()?;
28		if version != VERSION {
29			return None;
30		}
31
32		let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
33		if kind != Self::KIND {
34			return None;
35		}
36
37		Some(TransactionVersionKey {})
38	}
39}
40
41#[cfg(test)]
42mod tests {
43	use super::{EncodableKey, TransactionVersionKey};
44
45	#[test]
46	fn test_encode_decode() {
47		let key = TransactionVersionKey {};
48		let encoded = key.encode();
49		let expected = vec![
50			0xFE, // version
51			0xF4, // kind
52		];
53		assert_eq!(encoded.as_slice(), expected);
54
55		TransactionVersionKey::decode(&encoded).unwrap();
56	}
57}