reifydb_core/key/
ring_buffer.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 super::{EncodableKey, KeyKind};
5use crate::{
6	EncodedKey, EncodedKeyRange,
7	interface::RingBufferId,
8	util::encoding::keycode::{KeyDeserializer, KeySerializer},
9};
10
11const VERSION: u8 = 1;
12
13#[derive(Debug, Clone, PartialEq)]
14pub struct RingBufferKey {
15	pub ring_buffer: RingBufferId,
16}
17
18impl RingBufferKey {
19	pub fn new(ring_buffer: RingBufferId) -> Self {
20		Self {
21			ring_buffer,
22		}
23	}
24
25	pub fn full_scan() -> EncodedKeyRange {
26		EncodedKeyRange::start_end(Some(Self::ring_buffer_start()), Some(Self::ring_buffer_end()))
27	}
28
29	fn ring_buffer_start() -> EncodedKey {
30		let mut serializer = KeySerializer::with_capacity(2);
31		serializer.extend_u8(VERSION);
32		serializer.extend_u8(Self::KIND as u8);
33		serializer.to_encoded_key()
34	}
35
36	fn ring_buffer_end() -> EncodedKey {
37		let mut serializer = KeySerializer::with_capacity(2);
38		serializer.extend_u8(VERSION).extend_u8(Self::KIND as u8 - 1);
39		serializer.to_encoded_key()
40	}
41}
42
43impl EncodableKey for RingBufferKey {
44	const KIND: KeyKind = KeyKind::RingBuffer;
45
46	fn encode(&self) -> EncodedKey {
47		let mut serializer = KeySerializer::with_capacity(10);
48		serializer.extend_u8(VERSION).extend_u8(Self::KIND as u8).extend_u64(self.ring_buffer);
49		serializer.to_encoded_key()
50	}
51
52	fn decode(key: &EncodedKey) -> Option<Self> {
53		let mut de = KeyDeserializer::from_bytes(key.as_slice());
54
55		let version = de.read_u8().ok()?;
56		if version != VERSION {
57			return None;
58		}
59
60		let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
61		if kind != Self::KIND {
62			return None;
63		}
64
65		let ring_buffer = de.read_u64().ok()?;
66
67		Some(Self {
68			ring_buffer: RingBufferId(ring_buffer),
69		})
70	}
71}
72
73#[derive(Debug, Clone, PartialEq)]
74pub struct RingBufferMetadataKey {
75	pub ring_buffer: RingBufferId,
76}
77
78impl RingBufferMetadataKey {
79	pub fn new(ring_buffer: RingBufferId) -> Self {
80		Self {
81			ring_buffer,
82		}
83	}
84}
85
86impl EncodableKey for RingBufferMetadataKey {
87	const KIND: KeyKind = KeyKind::RingBufferMetadata;
88
89	fn encode(&self) -> EncodedKey {
90		let mut serializer = KeySerializer::with_capacity(10);
91		serializer.extend_u8(VERSION).extend_u8(Self::KIND as u8).extend_u64(self.ring_buffer);
92		serializer.to_encoded_key()
93	}
94
95	fn decode(key: &EncodedKey) -> Option<Self> {
96		let mut de = KeyDeserializer::from_bytes(key.as_slice());
97
98		let version = de.read_u8().ok()?;
99		if version != VERSION {
100			return None;
101		}
102
103		let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
104		if kind != Self::KIND {
105			return None;
106		}
107
108		let ring_buffer = de.read_u64().ok()?;
109
110		Some(Self {
111			ring_buffer: RingBufferId(ring_buffer),
112		})
113	}
114}