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