Skip to main content

reifydb_core/key/
system_version.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}