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