reifydb_core/key/
column_sequence.rs1use crate::{
5 EncodedKey,
6 interface::{ColumnId, SourceId},
7 key::{EncodableKey, KeyKind},
8 util::encoding::keycode::{KeyDeserializer, KeySerializer},
9};
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub struct ColumnSequenceKey {
13 pub source: SourceId,
14 pub column: ColumnId,
15}
16
17const VERSION: u8 = 1;
18
19impl EncodableKey for ColumnSequenceKey {
20 const KIND: KeyKind = KeyKind::ColumnSequence;
21
22 fn encode(&self) -> EncodedKey {
23 let mut serializer = KeySerializer::with_capacity(19); serializer
25 .extend_u8(VERSION)
26 .extend_u8(Self::KIND as u8)
27 .extend_source_id(self.source)
28 .extend_u64(self.column);
29 serializer.to_encoded_key()
30 }
31
32 fn decode(key: &EncodedKey) -> Option<Self> {
33 let mut de = KeyDeserializer::from_bytes(key.as_slice());
34
35 let version = de.read_u8().ok()?;
36 if version != VERSION {
37 return None;
38 }
39
40 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
41 if kind != Self::KIND {
42 return None;
43 }
44
45 let source = de.read_source_id().ok()?;
46 let column = de.read_u64().ok()?;
47
48 Some(Self {
49 source,
50 column: ColumnId(column),
51 })
52 }
53}
54
55#[cfg(test)]
56mod tests {
57 use super::{ColumnSequenceKey, EncodableKey};
58 use crate::{
59 EncodedKey,
60 interface::{ColumnId, SourceId},
61 };
62
63 #[test]
64 fn test_encode_decode() {
65 let key = ColumnSequenceKey {
66 source: SourceId::table(0x1234),
67 column: ColumnId(0x5678),
68 };
69 let encoded = key.encode();
70
71 assert_eq!(encoded[0], 0xFE); assert_eq!(encoded[1], 0xF1); let decoded = ColumnSequenceKey::decode(&encoded).unwrap();
76 assert_eq!(decoded.source, SourceId::table(0x1234));
77 assert_eq!(decoded.column, ColumnId(0x5678));
78 }
79
80 #[test]
81 fn test_decode_invalid_version() {
82 let mut encoded = vec![0xFF]; encoded.push(0x0E); encoded.extend(&[0; 16]); let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
87 assert!(decoded.is_none());
88 }
89
90 #[test]
91 fn test_decode_invalid_kind() {
92 let mut encoded = vec![0x01]; encoded.push(0xFF); encoded.extend(&[0; 16]); let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
97 assert!(decoded.is_none());
98 }
99
100 #[test]
101 fn test_decode_invalid_length() {
102 let encoded = vec![0x01, 0x0E]; let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
104 assert!(decoded.is_none());
105 }
106}