Skip to main content

reifydb_core/key/
row_settings.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use reifydb_codec::key::{
5	deserializer::KeyDeserializer,
6	encoded::{EncodedKey, EncodedKeyRange},
7	serializer::KeySerializer,
8};
9use serde::{Deserialize, Serialize};
10
11use super::{EncodableKey, KeyKind};
12use crate::interface::catalog::storage::StorageId;
13
14#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
15pub struct RowSettingsKey {
16	pub storage: StorageId,
17}
18
19impl RowSettingsKey {
20	pub fn encoded(storage: StorageId) -> EncodedKey {
21		Self {
22			storage,
23		}
24		.encode()
25	}
26}
27
28impl EncodableKey for RowSettingsKey {
29	const KIND: KeyKind = KeyKind::RowSettings;
30
31	fn encode(&self) -> EncodedKey {
32		let mut serializer = KeySerializer::with_capacity(10);
33		serializer.extend_u8(Self::KIND as u8);
34
35		serializer.extend_u8(self.storage.type_tag()).extend_u64(self.storage.as_u64());
36
37		serializer.to_encoded_key()
38	}
39
40	fn decode(key: &EncodedKey) -> Option<Self> {
41		let mut de = KeyDeserializer::from_bytes(key.as_slice());
42
43		let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
44		if kind != Self::KIND {
45			return None;
46		}
47
48		let discriminator = de.read_u8().ok()?;
49		let id = de.read_u64().ok()?;
50
51		Some(Self {
52			storage: StorageId::from_type_tag(discriminator, id)?,
53		})
54	}
55}
56
57pub struct RowSettingsKeyRange;
58
59impl RowSettingsKeyRange {
60	pub fn full_scan() -> EncodedKeyRange {
61		EncodedKeyRange::start_end(Some(Self::start()), Some(Self::end()))
62	}
63
64	fn start() -> EncodedKey {
65		let mut serializer = KeySerializer::with_capacity(1);
66		serializer.extend_u8(RowSettingsKey::KIND as u8);
67		serializer.to_encoded_key()
68	}
69
70	fn end() -> EncodedKey {
71		let mut serializer = KeySerializer::with_capacity(1);
72		serializer.extend_u8(RowSettingsKey::KIND as u8 - 1);
73		serializer.to_encoded_key()
74	}
75}
76
77#[cfg(test)]
78pub mod tests {
79	use super::*;
80	use crate::interface::catalog::id::{RingBufferId, SeriesId, TableId};
81
82	#[test]
83	fn test_row_settings_key_encoding() {
84		let key = RowSettingsKey {
85			storage: StorageId::Table(TableId(42)),
86		};
87
88		let encoded = key.encode();
89		let decoded = RowSettingsKey::decode(&encoded).unwrap();
90		assert_eq!(key, decoded);
91	}
92
93	#[test]
94	fn test_row_settings_key_roundtrip_ringbuffer() {
95		let key = RowSettingsKey {
96			storage: StorageId::RingBuffer(RingBufferId(99)),
97		};
98
99		let encoded = key.encode();
100		let decoded = RowSettingsKey::decode(&encoded).unwrap();
101		assert_eq!(key, decoded);
102	}
103
104	#[test]
105	fn test_row_settings_key_roundtrip_series() {
106		let key = RowSettingsKey {
107			storage: StorageId::Series(SeriesId(7)),
108		};
109
110		let encoded = key.encode();
111		let decoded = RowSettingsKey::decode(&encoded).unwrap();
112		assert_eq!(key, decoded);
113	}
114}