Skip to main content

reifydb_core/key/
flow_version.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}