reifydb_core/key/
flow_version.rs1use super::{EncodableKey, KeyKind};
5use crate::{
6 encoded::key::EncodedKey,
7 interface::catalog::flow::FlowId,
8 util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
9};
10
11#[derive(Debug, Clone, PartialEq)]
12pub struct FlowVersionKey {
13 pub flow: FlowId,
14}
15
16impl EncodableKey for FlowVersionKey {
17 const KIND: KeyKind = KeyKind::FlowVersion;
18
19 fn encode(&self) -> EncodedKey {
20 let mut serializer = KeySerializer::with_capacity(9);
21 serializer.extend_u8(Self::KIND as u8).extend_u64(self.flow);
22 serializer.to_encoded_key()
23 }
24
25 fn decode(key: &EncodedKey) -> Option<Self> {
26 let mut de = KeyDeserializer::from_bytes(key.as_slice());
27
28 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
29 if kind != Self::KIND {
30 return None;
31 }
32
33 let flow = de.read_u64().ok()?;
34
35 Some(Self {
36 flow: FlowId(flow),
37 })
38 }
39}
40
41impl FlowVersionKey {
42 pub fn new(flow: impl Into<FlowId>) -> Self {
43 Self {
44 flow: flow.into(),
45 }
46 }
47
48 pub fn encoded(flow: impl Into<FlowId>) -> EncodedKey {
49 Self::new(flow).encode()
50 }
51}
52
53#[cfg(test)]
54pub mod tests {
55 use super::{EncodableKey, FlowVersionKey};
56 use crate::interface::catalog::flow::FlowId;
57
58 #[test]
59 fn test_encode_decode() {
60 let key = FlowVersionKey {
61 flow: FlowId(0x1234),
62 };
63 let encoded = key.encode();
64 let decoded = FlowVersionKey::decode(&encoded).unwrap();
65 assert_eq!(decoded.flow, FlowId(0x1234));
66 assert_eq!(key, decoded);
67 }
68
69 #[test]
70 fn test_new_and_encoded() {
71 let key = FlowVersionKey::new(42u64);
72 assert_eq!(key.flow, FlowId(42));
73
74 let encoded = FlowVersionKey::encoded(42u64);
75 let decoded = FlowVersionKey::decode(&encoded).unwrap();
76 assert_eq!(decoded.flow, FlowId(42));
77 }
78}