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