reifydb_core/key/
system_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 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
40impl SystemVersionKey {
41	pub fn encoded(version: SystemVersion) -> EncodedKey {
42		Self {
43			version,
44		}
45		.encode()
46	}
47}
48
49const VERSION: u8 = 1;
50
51impl EncodableKey for SystemVersionKey {
52	const KIND: KeyKind = KeyKind::SystemVersion;
53
54	fn encode(&self) -> EncodedKey {
55		let mut serializer = KeySerializer::with_capacity(3);
56		serializer.extend_u8(VERSION).extend_u8(Self::KIND as u8).extend_serialize(&self.version);
57		serializer.to_encoded_key()
58	}
59
60	fn decode(key: &EncodedKey) -> Option<Self>
61	where
62		Self: Sized,
63	{
64		let mut de = KeyDeserializer::from_bytes(key.as_slice());
65
66		let version = de.read_u8().ok()?;
67		if version != VERSION {
68			return None;
69		}
70
71		let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
72		if kind != Self::KIND {
73			return None;
74		}
75
76		let version_enum = de.read_u8().ok()?.try_into().ok()?;
77
78		Some(Self {
79			version: version_enum,
80		})
81	}
82}
83
84#[cfg(test)]
85mod tests {
86	use super::{EncodableKey, SystemVersion, SystemVersionKey};
87
88	#[test]
89	fn test_encode_decode_storage_version() {
90		let key = SystemVersionKey {
91			version: SystemVersion::Storage,
92		};
93		let encoded = key.encode();
94		let expected = vec![
95			0xFE, // version
96			0xF5, // kind
97			0xFE,
98		];
99		assert_eq!(encoded.as_slice(), expected);
100
101		let key = SystemVersionKey::decode(&encoded).unwrap();
102		assert_eq!(key.version, SystemVersion::Storage);
103	}
104}