Skip to main content

reifydb_core/key/
mod.rs

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