Skip to main content

reifydb_core/key/
handler.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use crate::{
5	encoded::key::{EncodedKey, EncodedKeyRange},
6	interface::catalog::id::HandlerId,
7	key::{EncodableKey, KeyKind},
8	util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
9};
10
11#[derive(Debug, Clone, PartialEq)]
12pub struct HandlerKey {
13	pub handler: HandlerId,
14}
15
16impl HandlerKey {
17	pub fn new(handler: HandlerId) -> Self {
18		Self {
19			handler,
20		}
21	}
22
23	pub fn encoded(handler: impl Into<HandlerId>) -> EncodedKey {
24		Self::new(handler.into()).encode()
25	}
26
27	pub fn full_scan() -> EncodedKeyRange {
28		EncodedKeyRange::start_end(Some(Self::start()), Some(Self::end()))
29	}
30
31	fn start() -> EncodedKey {
32		let mut serializer = KeySerializer::with_capacity(1);
33		serializer.extend_u8(Self::KIND as u8);
34		serializer.to_encoded_key()
35	}
36
37	fn end() -> EncodedKey {
38		let mut serializer = KeySerializer::with_capacity(1);
39		serializer.extend_u8(Self::KIND as u8 - 1);
40		serializer.to_encoded_key()
41	}
42}
43
44impl EncodableKey for HandlerKey {
45	const KIND: KeyKind = KeyKind::Handler;
46
47	fn encode(&self) -> EncodedKey {
48		let mut serializer = KeySerializer::with_capacity(9);
49		serializer.extend_u8(Self::KIND as u8).extend_u64(self.handler);
50		serializer.to_encoded_key()
51	}
52
53	fn decode(key: &EncodedKey) -> Option<Self> {
54		let mut de = KeyDeserializer::from_bytes(key.as_slice());
55
56		let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
57		if kind != Self::KIND {
58			return None;
59		}
60
61		let handler = de.read_u64().ok()?;
62
63		Some(Self {
64			handler: HandlerId(handler),
65		})
66	}
67}
68
69#[cfg(test)]
70pub mod tests {
71	use super::{EncodableKey, HandlerKey};
72	use crate::interface::catalog::id::HandlerId;
73
74	#[test]
75	fn test_encode_decode() {
76		let key = HandlerKey {
77			handler: HandlerId(0xABCD),
78		};
79		let encoded = key.encode();
80		let expected = vec![0xD1, 0x3F, 0x54, 0x32];
81		assert_eq!(encoded.as_slice(), expected);
82
83		let decoded = HandlerKey::decode(&encoded).unwrap();
84		assert_eq!(decoded.handler, HandlerId(0xABCD));
85	}
86}