1use authentication::AuthenticationKey;
5use binding::BindingKey;
6use cdc_consumer::CdcConsumerKey;
7use column::ColumnKey;
8use column_sequence::ColumnSequenceKey;
9use columns::ColumnsKey;
10use dictionary::{DictionaryEntryIndexKey, DictionaryEntryKey, DictionaryKey, DictionarySequenceKey};
11use flow::FlowKey;
12use flow_node_internal_state::FlowNodeInternalStateKey;
13use flow_node_state::FlowNodeStateKey;
14use granted_role::GrantedRoleKey;
15use handler::HandlerKey;
16use identity::IdentityKey;
17use index::IndexKey;
18use index_entry::IndexEntryKey;
19use kind::KeyKind;
20use namespace::NamespaceKey;
21use namespace_binding::NamespaceBindingKey;
22use namespace_dictionary::NamespaceDictionaryKey;
23use namespace_flow::NamespaceFlowKey;
24use namespace_handler::NamespaceHandlerKey;
25use namespace_procedure::NamespaceProcedureKey;
26use namespace_ringbuffer::NamespaceRingBufferKey;
27use namespace_series::NamespaceSeriesKey;
28use namespace_sink::NamespaceSinkKey;
29use namespace_source::NamespaceSourceKey;
30use namespace_sumtype::NamespaceSumTypeKey;
31use namespace_table::NamespaceTableKey;
32use namespace_view::NamespaceViewKey;
33use policy::PolicyKey;
34use policy_op::PolicyOpKey;
35use primary_key::PrimaryKeyKey;
36use procedure::ProcedureKey;
37use procedure_param::ProcedureParamKey;
38use property::ColumnPropertyKey;
39use retention_strategy::{OperatorRetentionStrategyKey, ShapeRetentionStrategyKey};
40use ringbuffer::{RingBufferKey, RingBufferMetadataKey};
41use role::RoleKey;
42use row::RowKey;
43use row_sequence::RowSequenceKey;
44use series::{SeriesKey, SeriesMetadataKey};
45use sink::SinkKey;
46use source::SourceKey;
47use sumtype::SumTypeKey;
48use system_sequence::SystemSequenceKey;
49use system_version::SystemVersionKey;
50use table::TableKey;
51use token::TokenKey;
52use transaction_version::TransactionVersionKey;
53use view::ViewKey;
54
55use crate::{
56 encoded::key::{EncodedKey, EncodedKeyRange},
57 util::encoding::keycode,
58};
59
60pub mod authentication;
61pub mod binding;
62pub mod cdc_consumer;
63pub mod cdc_exclude;
64pub mod column;
65pub mod column_sequence;
66pub mod columns;
67pub mod config;
68pub mod dictionary;
69pub mod flow;
70pub mod flow_edge;
71pub mod flow_node;
72pub mod flow_node_internal_state;
73pub mod flow_node_state;
74pub mod flow_version;
75pub mod granted_role;
76pub mod handler;
77pub mod identity;
78pub mod index;
79pub mod index_entry;
80pub mod kind;
81pub mod migration;
82pub mod migration_event;
83pub mod namespace;
84pub mod namespace_binding;
85pub mod namespace_dictionary;
86pub mod namespace_flow;
87pub mod namespace_handler;
88pub mod namespace_procedure;
89pub mod namespace_ringbuffer;
90pub mod namespace_series;
91pub mod namespace_sink;
92pub mod namespace_source;
93pub mod namespace_sumtype;
94pub mod namespace_table;
95pub mod namespace_view;
96pub mod operator_ttl;
97pub mod policy;
98pub mod policy_op;
99pub mod primary_key;
100pub mod procedure;
101pub mod procedure_param;
102pub mod property;
103pub mod retention_strategy;
104pub mod ringbuffer;
105pub mod role;
106pub mod row;
107pub mod row_sequence;
108pub mod row_ttl;
109pub mod series;
110pub mod series_row;
111pub mod shape;
112pub mod sink;
113pub mod source;
114pub mod sumtype;
115pub mod system_sequence;
116pub mod system_version;
117pub mod table;
118pub mod token;
119pub mod transaction_version;
120pub mod variant_handler;
121pub mod view;
122#[derive(Debug)]
123pub enum Key {
124 CdcConsumer(CdcConsumerKey),
125 Namespace(NamespaceKey),
126 NamespaceTable(NamespaceTableKey),
127 NamespaceView(NamespaceViewKey),
128 NamespaceFlow(NamespaceFlowKey),
129 SystemSequence(SystemSequenceKey),
130 Table(TableKey),
131 Flow(FlowKey),
132 Column(ColumnKey),
133 Columns(ColumnsKey),
134 Index(IndexKey),
135 IndexEntry(IndexEntryKey),
136 FlowNodeState(FlowNodeStateKey),
137 FlowNodeInternalState(FlowNodeInternalStateKey),
138 PrimaryKey(PrimaryKeyKey),
139 Row(RowKey),
140 RowSequence(RowSequenceKey),
141 TableColumnSequence(ColumnSequenceKey),
142 TableColumnProperty(ColumnPropertyKey),
143 SystemVersion(SystemVersionKey),
144 TransactionVersion(TransactionVersionKey),
145 View(ViewKey),
146 RingBuffer(RingBufferKey),
147 RingBufferMetadata(RingBufferMetadataKey),
148 NamespaceRingBuffer(NamespaceRingBufferKey),
149 ShapeRetentionStrategy(ShapeRetentionStrategyKey),
150 OperatorRetentionStrategy(OperatorRetentionStrategyKey),
151 Dictionary(DictionaryKey),
152 DictionaryEntry(DictionaryEntryKey),
153 DictionaryEntryIndex(DictionaryEntryIndexKey),
154 DictionarySequence(DictionarySequenceKey),
155 NamespaceDictionary(NamespaceDictionaryKey),
156 SumType(SumTypeKey),
157 NamespaceSumType(NamespaceSumTypeKey),
158 Handler(HandlerKey),
159 NamespaceHandler(NamespaceHandlerKey),
160 Series(SeriesKey),
161 SeriesMetadata(SeriesMetadataKey),
162 NamespaceSeries(NamespaceSeriesKey),
163 Identity(IdentityKey),
164 Authentication(AuthenticationKey),
165 Role(RoleKey),
166 GrantedRole(GrantedRoleKey),
167 Policy(PolicyKey),
168 PolicyOp(PolicyOpKey),
169 Token(TokenKey),
170 Source(SourceKey),
171 NamespaceSource(NamespaceSourceKey),
172 Sink(SinkKey),
173 NamespaceSink(NamespaceSinkKey),
174 Procedure(ProcedureKey),
175 NamespaceProcedure(NamespaceProcedureKey),
176 ProcedureParam(ProcedureParamKey),
177 Binding(BindingKey),
178 NamespaceBinding(NamespaceBindingKey),
179}
180
181impl Key {
182 pub fn encode(&self) -> EncodedKey {
183 match &self {
184 Key::CdcConsumer(key) => key.encode(),
185 Key::Namespace(key) => key.encode(),
186 Key::NamespaceTable(key) => key.encode(),
187 Key::NamespaceView(key) => key.encode(),
188 Key::NamespaceFlow(key) => key.encode(),
189 Key::Table(key) => key.encode(),
190 Key::Flow(key) => key.encode(),
191 Key::Column(key) => key.encode(),
192 Key::Columns(key) => key.encode(),
193 Key::TableColumnProperty(key) => key.encode(),
194 Key::Index(key) => key.encode(),
195 Key::IndexEntry(key) => key.encode(),
196 Key::FlowNodeState(key) => key.encode(),
197 Key::FlowNodeInternalState(key) => key.encode(),
198 Key::PrimaryKey(key) => key.encode(),
199 Key::Row(key) => key.encode(),
200 Key::RowSequence(key) => key.encode(),
201 Key::TableColumnSequence(key) => key.encode(),
202 Key::SystemSequence(key) => key.encode(),
203 Key::SystemVersion(key) => key.encode(),
204 Key::TransactionVersion(key) => key.encode(),
205 Key::View(key) => key.encode(),
206 Key::RingBuffer(key) => key.encode(),
207 Key::RingBufferMetadata(key) => key.encode(),
208 Key::NamespaceRingBuffer(key) => key.encode(),
209 Key::ShapeRetentionStrategy(key) => key.encode(),
210 Key::OperatorRetentionStrategy(key) => key.encode(),
211 Key::Dictionary(key) => key.encode(),
212 Key::DictionaryEntry(key) => key.encode(),
213 Key::DictionaryEntryIndex(key) => key.encode(),
214 Key::DictionarySequence(key) => key.encode(),
215 Key::NamespaceDictionary(key) => key.encode(),
216 Key::SumType(key) => key.encode(),
217 Key::NamespaceSumType(key) => key.encode(),
218 Key::Handler(key) => key.encode(),
219 Key::NamespaceHandler(key) => key.encode(),
220 Key::Series(key) => key.encode(),
221 Key::SeriesMetadata(key) => key.encode(),
222 Key::NamespaceSeries(key) => key.encode(),
223 Key::Identity(key) => key.encode(),
224 Key::Authentication(key) => key.encode(),
225 Key::Role(key) => key.encode(),
226 Key::GrantedRole(key) => key.encode(),
227 Key::Policy(key) => key.encode(),
228 Key::PolicyOp(key) => key.encode(),
229 Key::Token(key) => key.encode(),
230 Key::Source(key) => key.encode(),
231 Key::NamespaceSource(key) => key.encode(),
232 Key::Sink(key) => key.encode(),
233 Key::NamespaceSink(key) => key.encode(),
234 Key::Procedure(key) => key.encode(),
235 Key::NamespaceProcedure(key) => key.encode(),
236 Key::ProcedureParam(key) => key.encode(),
237 Key::Binding(key) => key.encode(),
238 Key::NamespaceBinding(key) => key.encode(),
239 }
240 }
241}
242
243pub trait EncodableKey {
244 const KIND: KeyKind;
245
246 fn encode(&self) -> EncodedKey;
247
248 fn decode(key: &EncodedKey) -> Option<Self>
249 where
250 Self: Sized;
251}
252
253pub trait EncodableKeyRange {
254 const KIND: KeyKind;
255
256 fn start(&self) -> Option<EncodedKey>;
257
258 fn end(&self) -> Option<EncodedKey>;
259
260 fn decode(range: &EncodedKeyRange) -> (Option<Self>, Option<Self>)
261 where
262 Self: Sized;
263}
264
265impl Key {
266 pub fn kind(key: impl AsRef<[u8]>) -> Option<KeyKind> {
267 let key = key.as_ref();
268 if key.is_empty() {
269 return None;
270 }
271
272 keycode::deserialize(&key[0..1]).ok()
273 }
274
275 pub fn decode(key: &EncodedKey) -> Option<Self> {
276 if key.is_empty() {
277 return None;
278 }
279
280 let kind: KeyKind = keycode::deserialize(&key[0..1]).ok()?;
281 match kind {
282 KeyKind::CdcConsumer => CdcConsumerKey::decode(key).map(Self::CdcConsumer),
283 KeyKind::Columns => ColumnsKey::decode(key).map(Self::Columns),
284 KeyKind::ColumnProperty => ColumnPropertyKey::decode(key).map(Self::TableColumnProperty),
285 KeyKind::Namespace => NamespaceKey::decode(key).map(Self::Namespace),
286 KeyKind::NamespaceTable => NamespaceTableKey::decode(key).map(Self::NamespaceTable),
287 KeyKind::NamespaceView => NamespaceViewKey::decode(key).map(Self::NamespaceView),
288 KeyKind::NamespaceFlow => NamespaceFlowKey::decode(key).map(Self::NamespaceFlow),
289 KeyKind::Table => TableKey::decode(key).map(Self::Table),
290 KeyKind::Flow => FlowKey::decode(key).map(Self::Flow),
291 KeyKind::Column => ColumnKey::decode(key).map(Self::Column),
292 KeyKind::Index => IndexKey::decode(key).map(Self::Index),
293 KeyKind::IndexEntry => IndexEntryKey::decode(key).map(Self::IndexEntry),
294 KeyKind::FlowNodeState => FlowNodeStateKey::decode(key).map(Self::FlowNodeState),
295 KeyKind::FlowNodeInternalState => {
296 FlowNodeInternalStateKey::decode(key).map(Self::FlowNodeInternalState)
297 }
298 KeyKind::Row => RowKey::decode(key).map(Self::Row),
299 KeyKind::RowSequence => RowSequenceKey::decode(key).map(Self::RowSequence),
300 KeyKind::ColumnSequence => ColumnSequenceKey::decode(key).map(Self::TableColumnSequence),
301 KeyKind::SystemSequence => SystemSequenceKey::decode(key).map(Self::SystemSequence),
302 KeyKind::SystemVersion => SystemVersionKey::decode(key).map(Self::SystemVersion),
303 KeyKind::TransactionVersion => TransactionVersionKey::decode(key).map(Self::TransactionVersion),
304 KeyKind::View => ViewKey::decode(key).map(Self::View),
305 KeyKind::PrimaryKey => PrimaryKeyKey::decode(key).map(Self::PrimaryKey),
306 KeyKind::RingBuffer => RingBufferKey::decode(key).map(Self::RingBuffer),
307 KeyKind::RingBufferMetadata => RingBufferMetadataKey::decode(key).map(Self::RingBufferMetadata),
308 KeyKind::NamespaceRingBuffer => {
309 NamespaceRingBufferKey::decode(key).map(Self::NamespaceRingBuffer)
310 }
311 KeyKind::ShapeRetentionStrategy => {
312 ShapeRetentionStrategyKey::decode(key).map(Self::ShapeRetentionStrategy)
313 }
314 KeyKind::OperatorRetentionStrategy => {
315 OperatorRetentionStrategyKey::decode(key).map(Self::OperatorRetentionStrategy)
316 }
317 KeyKind::FlowNode
318 | KeyKind::FlowNodeByFlow
319 | KeyKind::FlowEdge
320 | KeyKind::FlowEdgeByFlow
321 | KeyKind::FlowVersion => None,
322 KeyKind::Dictionary => DictionaryKey::decode(key).map(Self::Dictionary),
323 KeyKind::DictionaryEntry => DictionaryEntryKey::decode(key).map(Self::DictionaryEntry),
324 KeyKind::DictionaryEntryIndex => {
325 DictionaryEntryIndexKey::decode(key).map(Self::DictionaryEntryIndex)
326 }
327 KeyKind::DictionarySequence => DictionarySequenceKey::decode(key).map(Self::DictionarySequence),
328 KeyKind::NamespaceDictionary => {
329 NamespaceDictionaryKey::decode(key).map(Self::NamespaceDictionary)
330 }
331 KeyKind::SumType => SumTypeKey::decode(key).map(Self::SumType),
332 KeyKind::NamespaceSumType => NamespaceSumTypeKey::decode(key).map(Self::NamespaceSumType),
333 KeyKind::Handler => HandlerKey::decode(key).map(Self::Handler),
334 KeyKind::NamespaceHandler => NamespaceHandlerKey::decode(key).map(Self::NamespaceHandler),
335 KeyKind::VariantHandler => None,
336 KeyKind::Metric => None,
337 KeyKind::Subscription | KeyKind::SubscriptionColumn | KeyKind::SubscriptionRow => None,
338 KeyKind::Shape | KeyKind::RowShapeField => None,
339 KeyKind::Series => SeriesKey::decode(key).map(Self::Series),
340 KeyKind::NamespaceSeries => NamespaceSeriesKey::decode(key).map(Self::NamespaceSeries),
341 KeyKind::SeriesMetadata => SeriesMetadataKey::decode(key).map(Self::SeriesMetadata),
342 KeyKind::Identity => IdentityKey::decode(key).map(Self::Identity),
343 KeyKind::Authentication => AuthenticationKey::decode(key).map(Self::Authentication),
344 KeyKind::Role => RoleKey::decode(key).map(Self::Role),
345 KeyKind::GrantedRole => GrantedRoleKey::decode(key).map(Self::GrantedRole),
346 KeyKind::Policy => PolicyKey::decode(key).map(Self::Policy),
347 KeyKind::PolicyOp => PolicyOpKey::decode(key).map(Self::PolicyOp),
348 KeyKind::Migration | KeyKind::MigrationEvent => None,
349 KeyKind::Token => TokenKey::decode(key).map(Self::Token),
350 KeyKind::ConfigStorage => None,
351 KeyKind::Source
352 | KeyKind::NamespaceSource
353 | KeyKind::Sink
354 | KeyKind::NamespaceSink
355 | KeyKind::SourceCheckpoint => None,
356 KeyKind::RowTtl => None,
357 KeyKind::OperatorTtl => None,
358 KeyKind::Procedure => ProcedureKey::decode(key).map(Self::Procedure),
359 KeyKind::NamespaceProcedure => NamespaceProcedureKey::decode(key).map(Self::NamespaceProcedure),
360 KeyKind::ProcedureParam => ProcedureParamKey::decode(key).map(Self::ProcedureParam),
361 KeyKind::Binding => BindingKey::decode(key).map(Self::Binding),
362 KeyKind::NamespaceBinding => None,
363 }
364 }
365}
366
367#[cfg(test)]
368pub mod tests {
369 use reifydb_type::value::{row_number::RowNumber, sumtype::SumTypeId};
370
371 use crate::{
372 interface::catalog::{
373 flow::FlowNodeId,
374 id::{ColumnId, ColumnPropertyId, IndexId, NamespaceId, SequenceId, TableId},
375 shape::ShapeId,
376 },
377 key::{
378 Key, column::ColumnKey, column_sequence::ColumnSequenceKey, columns::ColumnsKey,
379 flow_node_state::FlowNodeStateKey, index::IndexKey, namespace::NamespaceKey,
380 namespace_sumtype::NamespaceSumTypeKey, namespace_table::NamespaceTableKey,
381 property::ColumnPropertyKey, row::RowKey, row_sequence::RowSequenceKey, sumtype::SumTypeKey,
382 system_sequence::SystemSequenceKey, table::TableKey,
383 transaction_version::TransactionVersionKey,
384 },
385 };
386
387 #[test]
388 fn test_table_columns() {
389 let key = Key::Columns(ColumnsKey {
390 column: ColumnId(42),
391 });
392
393 let encoded = key.encode();
394 let decoded = Key::decode(&encoded).expect("Failed to decode key");
395
396 match decoded {
397 Key::Columns(decoded_inner) => {
398 assert_eq!(decoded_inner.column, 42);
399 }
400 _ => unreachable!(),
401 }
402 }
403
404 #[test]
405 fn test_column() {
406 let key = Key::Column(ColumnKey {
407 shape: ShapeId::table(1),
408 column: ColumnId(42),
409 });
410
411 let encoded = key.encode();
412 let decoded = Key::decode(&encoded).expect("Failed to decode key");
413
414 match decoded {
415 Key::Column(decoded_inner) => {
416 assert_eq!(decoded_inner.shape, ShapeId::table(1));
417 assert_eq!(decoded_inner.column, 42);
418 }
419 _ => unreachable!(),
420 }
421 }
422
423 #[test]
424 fn test_column_property() {
425 let key = Key::TableColumnProperty(ColumnPropertyKey {
426 column: ColumnId(42),
427 property: ColumnPropertyId(999_999),
428 });
429
430 let encoded = key.encode();
431 let decoded = Key::decode(&encoded).expect("Failed to decode key");
432
433 match decoded {
434 Key::TableColumnProperty(decoded_inner) => {
435 assert_eq!(decoded_inner.column, 42);
436 assert_eq!(decoded_inner.property, 999_999);
437 }
438 _ => unreachable!(),
439 }
440 }
441
442 #[test]
443 fn test_namespace() {
444 let key = Key::Namespace(NamespaceKey {
445 namespace: NamespaceId(42),
446 });
447
448 let encoded = key.encode();
449 let decoded = Key::decode(&encoded).expect("Failed to decode key");
450
451 match decoded {
452 Key::Namespace(decoded_inner) => {
453 assert_eq!(decoded_inner.namespace, 42);
454 }
455 _ => unreachable!(),
456 }
457 }
458
459 #[test]
460 fn test_namespace_table() {
461 let key = Key::NamespaceTable(NamespaceTableKey {
462 namespace: NamespaceId(42),
463 table: TableId(999_999),
464 });
465
466 let encoded = key.encode();
467 let decoded = Key::decode(&encoded).expect("Failed to decode key");
468
469 match decoded {
470 Key::NamespaceTable(decoded_inner) => {
471 assert_eq!(decoded_inner.namespace, 42);
472 assert_eq!(decoded_inner.table, 999_999);
473 }
474 _ => unreachable!(),
475 }
476 }
477
478 #[test]
479 fn test_system_sequence() {
480 let key = Key::SystemSequence(SystemSequenceKey {
481 sequence: SequenceId(42),
482 });
483
484 let encoded = key.encode();
485 let decoded = Key::decode(&encoded).expect("Failed to decode key");
486
487 match decoded {
488 Key::SystemSequence(decoded_inner) => {
489 assert_eq!(decoded_inner.sequence, 42);
490 }
491 _ => unreachable!(),
492 }
493 }
494
495 #[test]
496 fn test_table() {
497 let key = Key::Table(TableKey {
498 table: TableId(42),
499 });
500
501 let encoded = key.encode();
502 let decoded = Key::decode(&encoded).expect("Failed to decode key");
503
504 match decoded {
505 Key::Table(decoded_inner) => {
506 assert_eq!(decoded_inner.table, 42);
507 }
508 _ => unreachable!(),
509 }
510 }
511
512 #[test]
513 fn test_index() {
514 let key = Key::Index(IndexKey {
515 shape: ShapeId::table(42),
516 index: IndexId::primary(999_999),
517 });
518
519 let encoded = key.encode();
520 let decoded = Key::decode(&encoded).expect("Failed to decode key");
521
522 match decoded {
523 Key::Index(decoded_inner) => {
524 assert_eq!(decoded_inner.shape, ShapeId::table(42));
525 assert_eq!(decoded_inner.index, 999_999);
526 }
527 _ => unreachable!(),
528 }
529 }
530
531 #[test]
532 fn test_row() {
533 let key = Key::Row(RowKey {
534 shape: ShapeId::table(42),
535 row: RowNumber(999_999),
536 });
537
538 let encoded = key.encode();
539 let decoded = Key::decode(&encoded).expect("Failed to decode key");
540
541 match decoded {
542 Key::Row(decoded_inner) => {
543 assert_eq!(decoded_inner.shape, ShapeId::table(42));
544 assert_eq!(decoded_inner.row, 999_999);
545 }
546 _ => unreachable!(),
547 }
548 }
549
550 #[test]
551 fn test_row_sequence() {
552 let key = Key::RowSequence(RowSequenceKey {
553 shape: ShapeId::table(42),
554 });
555
556 let encoded = key.encode();
557 let decoded = Key::decode(&encoded).expect("Failed to decode key");
558
559 match decoded {
560 Key::RowSequence(decoded_inner) => {
561 assert_eq!(decoded_inner.shape, ShapeId::table(42));
562 }
563 _ => unreachable!(),
564 }
565 }
566
567 #[test]
568 fn test_column_sequence() {
569 let key = Key::TableColumnSequence(ColumnSequenceKey {
570 shape: ShapeId::table(42),
571 column: ColumnId(123),
572 });
573
574 let encoded = key.encode();
575 let decoded = Key::decode(&encoded).expect("Failed to decode key");
576
577 match decoded {
578 Key::TableColumnSequence(decoded_inner) => {
579 assert_eq!(decoded_inner.shape, ShapeId::table(42));
580 assert_eq!(decoded_inner.column, 123);
581 }
582 _ => unreachable!(),
583 }
584 }
585
586 #[test]
587 fn test_transaction_version() {
588 let key = Key::TransactionVersion(TransactionVersionKey {});
589 let encoded = key.encode();
590 Key::decode(&encoded).expect("Failed to decode key");
591 }
592
593 #[test]
594 fn test_operator_state() {
595 let key = Key::FlowNodeState(FlowNodeStateKey {
596 node: FlowNodeId(0xCAFEBABE),
597 key: vec![1, 2, 3],
598 });
599
600 let encoded = key.encode();
601 let decoded = Key::decode(&encoded).expect("Failed to decode key");
602
603 match decoded {
604 Key::FlowNodeState(decoded_inner) => {
605 assert_eq!(decoded_inner.node, 0xCAFEBABE);
606 assert_eq!(decoded_inner.key, vec![1, 2, 3]);
607 }
608 _ => unreachable!(),
609 }
610 }
611
612 #[test]
613 fn test_sumtype_key() {
614 let key = Key::SumType(SumTypeKey {
615 sumtype: SumTypeId(42),
616 });
617
618 let encoded = key.encode();
619 let decoded = Key::decode(&encoded).expect("Failed to decode key");
620
621 match decoded {
622 Key::SumType(decoded_inner) => {
623 assert_eq!(decoded_inner.sumtype, 42);
624 }
625 _ => unreachable!(),
626 }
627 }
628
629 #[test]
630 fn test_namespace_sumtype_key() {
631 let key = Key::NamespaceSumType(NamespaceSumTypeKey {
632 namespace: NamespaceId(42),
633 sumtype: SumTypeId(999_999),
634 });
635
636 let encoded = key.encode();
637 let decoded = Key::decode(&encoded).expect("Failed to decode key");
638
639 match decoded {
640 Key::NamespaceSumType(decoded_inner) => {
641 assert_eq!(decoded_inner.namespace, 42);
642 assert_eq!(decoded_inner.sumtype, 999_999);
643 }
644 _ => unreachable!(),
645 }
646 }
647}