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
55impl ColumnSequenceKey {
56 pub fn encoded(source: impl Into<SourceId>, column: impl Into<ColumnId>) -> EncodedKey {
57 Self {
58 source: source.into(),
59 column: column.into(),
60 }
61 .encode()
62 }
63}
64
65#[cfg(test)]
66mod tests {
67 use super::{ColumnSequenceKey, EncodableKey};
68 use crate::{
69 EncodedKey,
70 interface::{ColumnId, SourceId},
71 };
72
73 #[test]
74 fn test_encode_decode() {
75 let key = ColumnSequenceKey {
76 source: SourceId::table(0x1234),
77 column: ColumnId(0x5678),
78 };
79 let encoded = key.encode();
80
81 assert_eq!(encoded[0], 0xFE); assert_eq!(encoded[1], 0xF1); let decoded = ColumnSequenceKey::decode(&encoded).unwrap();
86 assert_eq!(decoded.source, SourceId::table(0x1234));
87 assert_eq!(decoded.column, ColumnId(0x5678));
88 }
89
90 #[test]
91 fn test_decode_invalid_version() {
92 let mut encoded = vec![0xFF]; encoded.push(0x0E); 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_kind() {
102 let mut encoded = vec![0x01]; encoded.push(0xFF); encoded.extend(&[0; 16]); let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
107 assert!(decoded.is_none());
108 }
109
110 #[test]
111 fn test_decode_invalid_length() {
112 let encoded = vec![0x01, 0x0E]; let decoded = ColumnSequenceKey::decode(&EncodedKey::new(encoded));
114 assert!(decoded.is_none());
115 }
116}