Skip to main content

reifydb_core/key/
config.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright (c) 2025 ReifyDB
3
4use super::{EncodableKey, KeyKind};
5use crate::{
6	encoded::key::{EncodedKey, EncodedKeyRange},
7	util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
8};
9
10const VERSION: u8 = 1;
11
12#[derive(Debug, Clone, PartialEq)]
13pub struct ConfigKey {
14	pub key: String,
15}
16
17impl ConfigKey {
18	pub fn new(key: impl Into<String>) -> Self {
19		Self {
20			key: key.into(),
21		}
22	}
23
24	pub fn for_key(key: &str) -> EncodedKey {
25		Self::new(key).encode()
26	}
27
28	pub fn full_scan() -> EncodedKeyRange {
29		let mut start = KeySerializer::with_capacity(2);
30		start.extend_u8(VERSION).extend_u8(Self::KIND as u8);
31		let mut end = KeySerializer::with_capacity(2);
32		end.extend_u8(VERSION).extend_u8(Self::KIND as u8 - 1);
33		EncodedKeyRange::start_end(Some(start.to_encoded_key()), Some(end.to_encoded_key()))
34	}
35}
36
37impl EncodableKey for ConfigKey {
38	const KIND: KeyKind = KeyKind::Config;
39
40	fn encode(&self) -> EncodedKey {
41		let mut serializer = KeySerializer::with_capacity(32);
42		serializer.extend_u8(VERSION).extend_u8(Self::KIND as u8).extend_str(&self.key);
43		serializer.to_encoded_key()
44	}
45
46	fn decode(key: &EncodedKey) -> Option<Self> {
47		let mut de = KeyDeserializer::from_bytes(key.as_slice());
48
49		let version = de.read_u8().ok()?;
50		if version != VERSION {
51			return None;
52		}
53
54		let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
55		if kind != Self::KIND {
56			return None;
57		}
58
59		let config_key = de.read_str().ok()?;
60
61		Some(Self {
62			key: config_key,
63		})
64	}
65}