reifydb_core/key/
system_version.rs1use reifydb_codec::key::{deserializer::KeyDeserializer, encoded::EncodedKey, serializer::KeySerializer};
5use serde::{Deserialize, Serialize, de};
6
7use super::{EncodableKey, KeyKind};
8
9#[derive(Debug, Clone, PartialEq)]
10pub struct SystemVersionKey {
11 pub version: SystemVersion,
12}
13
14#[repr(u8)]
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
16#[serde(try_from = "u8", into = "u8")]
17pub enum SystemVersion {
18 Storage = 0x01,
19}
20
21impl From<SystemVersion> for u8 {
22 fn from(version: SystemVersion) -> Self {
23 version as u8
24 }
25}
26impl TryFrom<u8> for SystemVersion {
27 type Error = de::value::Error;
28
29 fn try_from(value: u8) -> Result<Self, Self::Error> {
30 match value {
31 0x01 => Ok(Self::Storage),
32 _ => Err(de::Error::custom(format!("Invalid SystemVersion value: {value:#04x}"))),
33 }
34 }
35}
36
37impl SystemVersionKey {
38 pub fn encoded(version: SystemVersion) -> EncodedKey {
39 Self {
40 version,
41 }
42 .encode()
43 }
44}
45
46impl EncodableKey for SystemVersionKey {
47 const KIND: KeyKind = KeyKind::SystemVersion;
48
49 fn encode(&self) -> EncodedKey {
50 let mut serializer = KeySerializer::with_capacity(2);
51 serializer.extend_u8(Self::KIND as u8).extend_serialize(&self.version);
52 serializer.to_encoded_key()
53 }
54
55 fn decode(key: &EncodedKey) -> Option<Self>
56 where
57 Self: Sized,
58 {
59 let mut de = KeyDeserializer::from_bytes(key.as_slice());
60
61 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
62 if kind != Self::KIND {
63 return None;
64 }
65
66 let version_enum = de.read_u8().ok()?.try_into().ok()?;
67
68 Some(Self {
69 version: version_enum,
70 })
71 }
72}
73
74#[cfg(test)]
75pub mod tests {
76 use super::{EncodableKey, SystemVersion, SystemVersionKey};
77
78 #[test]
79 fn test_encode_decode_storage_version() {
80 let key = SystemVersionKey {
81 version: SystemVersion::Storage,
82 };
83 let encoded = key.encode();
84 let expected = vec![0xF5, 0xFE];
85 assert_eq!(encoded.as_slice(), expected);
86
87 let key = SystemVersionKey::decode(&encoded).unwrap();
88 assert_eq!(key.version, SystemVersion::Storage);
89 }
90}