Skip to main content

reifydb_core/key/
migration_event.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use crate::{
5	encoded::key::{EncodedKey, EncodedKeyRange},
6	interface::catalog::id::MigrationEventId,
7	key::{EncodableKey, KeyKind},
8	util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
9};
10
11#[derive(Debug, Clone, PartialEq)]
12pub struct MigrationEventKey {
13	pub event: MigrationEventId,
14}
15
16impl MigrationEventKey {
17	pub fn new(event: MigrationEventId) -> Self {
18		Self {
19			event,
20		}
21	}
22
23	pub fn encoded(event: impl Into<MigrationEventId>) -> EncodedKey {
24		Self::new(event.into()).encode()
25	}
26
27	pub fn full_scan() -> EncodedKeyRange {
28		EncodedKeyRange::start_end(Some(Self::start()), Some(Self::end()))
29	}
30
31	fn start() -> EncodedKey {
32		let mut serializer = KeySerializer::with_capacity(1);
33		serializer.extend_u8(Self::KIND as u8);
34		serializer.to_encoded_key()
35	}
36
37	fn end() -> EncodedKey {
38		let mut serializer = KeySerializer::with_capacity(1);
39		serializer.extend_u8(Self::KIND as u8 - 1);
40		serializer.to_encoded_key()
41	}
42}
43
44impl EncodableKey for MigrationEventKey {
45	const KIND: KeyKind = KeyKind::MigrationEvent;
46
47	fn encode(&self) -> EncodedKey {
48		let mut serializer = KeySerializer::with_capacity(9);
49		serializer.extend_u8(Self::KIND as u8).extend_u64(self.event);
50		serializer.to_encoded_key()
51	}
52
53	fn decode(key: &EncodedKey) -> Option<Self> {
54		let mut de = KeyDeserializer::from_bytes(key.as_slice());
55
56		let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
57		if kind != Self::KIND {
58			return None;
59		}
60
61		let event = de.read_u64().ok()?;
62
63		Some(Self {
64			event: MigrationEventId(event),
65		})
66	}
67}