reifydb_core/key/
ring_buffer.rs1use 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}