1use std::{
5 borrow::Borrow,
6 cmp::Ordering,
7 collections::{
8 Bound,
9 Bound::{Excluded, Included, Unbounded},
10 },
11 fmt,
12 hash::{Hash, Hasher},
13 iter, mem,
14 ops::{Deref, RangeBounds},
15 sync::Arc,
16};
17
18use reifydb_value::{
19 util::hash::Hash128,
20 value::{
21 Value,
22 blob::Blob,
23 date::Date,
24 datetime::DateTime,
25 decimal::Decimal,
26 duration::Duration,
27 identity::IdentityId,
28 int::Int,
29 row_number::RowNumber,
30 time::Time,
31 uint::Uint,
32 uuid::{Uuid4, Uuid7},
33 },
34};
35use serde::{
36 de::{Deserialize, Deserializer},
37 ser::{Serialize, Serializer},
38};
39
40use crate::key::serializer::KeySerializer;
41
42fn decode_binary(s: &str) -> Vec<u8> {
43 let mut buf = [0; 4];
44 let mut bytes = Vec::new();
45 for c in s.chars() {
46 match c as u32 {
47 b @ 0x80..=0xff => bytes.push(b as u8),
48 _ => bytes.extend(c.encode_utf8(&mut buf).as_bytes()),
49 }
50 }
51 bytes
52}
53
54#[derive(Clone)]
55pub enum EncodedKey {
56 Inline {
57 len: u8,
58 buf: [u8; 62],
59 },
60 Heap(Vec<u8>),
61}
62
63const _: () = assert!(mem::size_of::<EncodedKey>() == 64);
64
65impl EncodedKey {
66 const INLINE_CAP: usize = 62;
67
68 pub fn new(key: impl Into<Vec<u8>>) -> Self {
69 let vec = key.into();
70 if vec.len() <= Self::INLINE_CAP {
71 let len = vec.len() as u8;
72 let mut buf = [0u8; 62];
73 buf[..vec.len()].copy_from_slice(&vec);
74 EncodedKey::Inline {
75 len,
76 buf,
77 }
78 } else {
79 EncodedKey::Heap(vec)
80 }
81 }
82
83 pub fn with_capacity(capacity: usize) -> Self {
84 if capacity <= Self::INLINE_CAP {
85 EncodedKey::Inline {
86 len: 0,
87 buf: [0u8; 62],
88 }
89 } else {
90 EncodedKey::Heap(Vec::with_capacity(capacity))
91 }
92 }
93
94 pub fn builder() -> EncodedKeyBuilder {
95 EncodedKeyBuilder::new()
96 }
97
98 pub fn as_bytes(&self) -> &[u8] {
99 self.as_slice()
100 }
101
102 pub fn as_slice(&self) -> &[u8] {
103 match self {
104 EncodedKey::Inline {
105 len,
106 buf,
107 } => &buf[..*len as usize],
108 EncodedKey::Heap(v) => v.as_slice(),
109 }
110 }
111
112 pub fn to_vec(&self) -> Vec<u8> {
113 self.as_slice().to_vec()
114 }
115
116 pub fn push(&mut self, byte: u8) {
117 match self {
118 EncodedKey::Inline {
119 len,
120 buf,
121 } => {
122 let cur = *len as usize;
123 if cur < Self::INLINE_CAP {
124 buf[cur] = byte;
125 *len += 1;
126 return;
127 }
128 let mut vec = Vec::with_capacity(cur + 1);
129 vec.extend_from_slice(&buf[..cur]);
130 vec.push(byte);
131 *self = EncodedKey::Heap(vec);
132 }
133 EncodedKey::Heap(v) => v.push(byte),
134 }
135 }
136
137 pub fn extend_from_slice(&mut self, slice: &[u8]) {
138 match self {
139 EncodedKey::Inline {
140 len,
141 buf,
142 } => {
143 let cur = *len as usize;
144 let total = cur + slice.len();
145 if total <= Self::INLINE_CAP {
146 buf[cur..total].copy_from_slice(slice);
147 *len = total as u8;
148 return;
149 }
150 let mut vec = Vec::with_capacity(total);
151 vec.extend_from_slice(&buf[..cur]);
152 vec.extend_from_slice(slice);
153 *self = EncodedKey::Heap(vec);
154 }
155 EncodedKey::Heap(v) => v.extend_from_slice(slice),
156 }
157 }
158}
159
160impl Deref for EncodedKey {
161 type Target = [u8];
162
163 fn deref(&self) -> &[u8] {
164 self.as_slice()
165 }
166}
167
168impl AsRef<[u8]> for EncodedKey {
169 fn as_ref(&self) -> &[u8] {
170 self.as_slice()
171 }
172}
173
174impl Borrow<[u8]> for EncodedKey {
175 fn borrow(&self) -> &[u8] {
176 self.as_slice()
177 }
178}
179
180impl PartialEq for EncodedKey {
181 fn eq(&self, other: &Self) -> bool {
182 self.as_slice() == other.as_slice()
183 }
184}
185
186impl Eq for EncodedKey {}
187
188impl PartialOrd for EncodedKey {
189 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
190 Some(self.cmp(other))
191 }
192}
193
194impl Ord for EncodedKey {
195 fn cmp(&self, other: &Self) -> Ordering {
196 self.as_slice().cmp(other.as_slice())
197 }
198}
199
200impl Hash for EncodedKey {
201 fn hash<H: Hasher>(&self, state: &mut H) {
202 self.as_slice().hash(state);
203 }
204}
205
206impl PartialEq<Vec<u8>> for EncodedKey {
207 fn eq(&self, other: &Vec<u8>) -> bool {
208 self.as_slice() == other.as_slice()
209 }
210}
211
212impl PartialEq<[u8]> for EncodedKey {
213 fn eq(&self, other: &[u8]) -> bool {
214 self.as_slice() == other
215 }
216}
217
218impl Serialize for EncodedKey {
219 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
220 self.as_slice().serialize(serializer)
221 }
222}
223
224impl<'de> Deserialize<'de> for EncodedKey {
225 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
226 let vec = Vec::<u8>::deserialize(deserializer)?;
227 Ok(EncodedKey::new(vec))
228 }
229}
230
231impl fmt::Debug for EncodedKey {
232 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
233 write!(f, "EncodedKey({:02x?})", self.as_slice())
234 }
235}
236
237pub struct EncodedKeyBuilder {
238 serializer: KeySerializer,
239}
240
241impl EncodedKeyBuilder {
242 pub fn new() -> Self {
243 Self {
244 serializer: KeySerializer::new(),
245 }
246 }
247
248 pub fn with_capacity(capacity: usize) -> Self {
249 Self {
250 serializer: KeySerializer::with_capacity(capacity),
251 }
252 }
253
254 pub fn build(self) -> EncodedKey {
255 self.serializer.to_encoded_key()
256 }
257
258 pub fn bool(mut self, value: bool) -> Self {
259 self.serializer.extend_bool(value);
260 self
261 }
262
263 pub fn f32(mut self, value: f32) -> Self {
264 self.serializer.extend_f32(value);
265 self
266 }
267
268 pub fn f64(mut self, value: f64) -> Self {
269 self.serializer.extend_f64(value);
270 self
271 }
272
273 pub fn i8<T: Into<i8>>(mut self, value: T) -> Self {
274 self.serializer.extend_i8(value);
275 self
276 }
277
278 pub fn i16<T: Into<i16>>(mut self, value: T) -> Self {
279 self.serializer.extend_i16(value);
280 self
281 }
282
283 pub fn i32<T: Into<i32>>(mut self, value: T) -> Self {
284 self.serializer.extend_i32(value);
285 self
286 }
287
288 pub fn i64<T: Into<i64>>(mut self, value: T) -> Self {
289 self.serializer.extend_i64(value);
290 self
291 }
292
293 pub fn i128<T: Into<i128>>(mut self, value: T) -> Self {
294 self.serializer.extend_i128(value);
295 self
296 }
297
298 pub fn u8<T: Into<u8>>(mut self, value: T) -> Self {
299 self.serializer.extend_u8(value);
300 self
301 }
302
303 pub fn u16<T: Into<u16>>(mut self, value: T) -> Self {
304 self.serializer.extend_u16(value);
305 self
306 }
307
308 pub fn u32<T: Into<u32>>(mut self, value: T) -> Self {
309 self.serializer.extend_u32(value);
310 self
311 }
312
313 pub fn u64<T: Into<u64>>(mut self, value: T) -> Self {
314 self.serializer.extend_u64(value);
315 self
316 }
317
318 pub fn u128<T: Into<u128>>(mut self, value: T) -> Self {
319 self.serializer.extend_u128(value);
320 self
321 }
322
323 pub fn bytes<T: AsRef<[u8]>>(mut self, bytes: T) -> Self {
324 self.serializer.extend_bytes(bytes);
325 self
326 }
327
328 pub fn str<T: AsRef<str>>(mut self, s: T) -> Self {
329 self.serializer.extend_str(s);
330 self
331 }
332
333 pub fn serialize<T: Serialize>(mut self, value: &T) -> Self {
334 self.serializer.extend_serialize(value);
335 self
336 }
337
338 pub fn raw(mut self, bytes: &[u8]) -> Self {
339 self.serializer.extend_raw(bytes);
340 self
341 }
342
343 pub fn len(&self) -> usize {
344 self.serializer.len()
345 }
346
347 pub fn is_empty(&self) -> bool {
348 self.serializer.is_empty()
349 }
350
351 pub fn date(mut self, date: &Date) -> Self {
352 self.serializer.extend_date(date);
353 self
354 }
355
356 pub fn datetime(mut self, datetime: &DateTime) -> Self {
357 self.serializer.extend_datetime(datetime);
358 self
359 }
360
361 pub fn time(mut self, time: &Time) -> Self {
362 self.serializer.extend_time(time);
363 self
364 }
365
366 pub fn duration(mut self, duration: &Duration) -> Self {
367 self.serializer.extend_duration(duration);
368 self
369 }
370
371 pub fn row_number(mut self, row_number: &RowNumber) -> Self {
372 self.serializer.extend_row_number(row_number);
373 self
374 }
375
376 pub fn identity_id(mut self, id: &IdentityId) -> Self {
377 self.serializer.extend_identity_id(id);
378 self
379 }
380
381 pub fn uuid4(mut self, uuid: &Uuid4) -> Self {
382 self.serializer.extend_uuid4(uuid);
383 self
384 }
385
386 pub fn uuid7(mut self, uuid: &Uuid7) -> Self {
387 self.serializer.extend_uuid7(uuid);
388 self
389 }
390
391 pub fn blob(mut self, blob: &Blob) -> Self {
392 self.serializer.extend_blob(blob);
393 self
394 }
395
396 pub fn int(mut self, int: &Int) -> Self {
397 self.serializer.extend_int(int);
398 self
399 }
400
401 pub fn uint(mut self, uint: &Uint) -> Self {
402 self.serializer.extend_uint(uint);
403 self
404 }
405
406 pub fn decimal(mut self, decimal: &Decimal) -> Self {
407 self.serializer.extend_decimal(decimal);
408 self
409 }
410
411 pub fn value(mut self, value: &Value) -> Self {
412 self.serializer.extend_value(value);
413 self
414 }
415}
416
417impl Default for EncodedKeyBuilder {
418 fn default() -> Self {
419 Self::new()
420 }
421}
422
423pub trait IntoEncodedKey {
424 fn into_encoded_key(self) -> EncodedKey;
425}
426
427impl IntoEncodedKey for EncodedKey {
428 fn into_encoded_key(self) -> EncodedKey {
429 self
430 }
431}
432
433impl IntoEncodedKey for &str {
434 fn into_encoded_key(self) -> EncodedKey {
435 let mut serializer = KeySerializer::new();
436 serializer.extend_str(self);
437 serializer.to_encoded_key()
438 }
439}
440
441impl IntoEncodedKey for String {
442 fn into_encoded_key(self) -> EncodedKey {
443 let mut serializer = KeySerializer::new();
444 serializer.extend_str(&self);
445 serializer.to_encoded_key()
446 }
447}
448
449impl IntoEncodedKey for Vec<u8> {
450 fn into_encoded_key(self) -> EncodedKey {
451 let mut serializer = KeySerializer::new();
452 serializer.extend_bytes(&self);
453 serializer.to_encoded_key()
454 }
455}
456
457impl IntoEncodedKey for &[u8] {
458 fn into_encoded_key(self) -> EncodedKey {
459 let mut serializer = KeySerializer::new();
460 serializer.extend_bytes(self);
461 serializer.to_encoded_key()
462 }
463}
464
465impl IntoEncodedKey for u64 {
466 fn into_encoded_key(self) -> EncodedKey {
467 let mut serializer = KeySerializer::with_capacity(8);
468 serializer.extend_u64(self);
469 serializer.to_encoded_key()
470 }
471}
472
473impl IntoEncodedKey for i64 {
474 fn into_encoded_key(self) -> EncodedKey {
475 let mut serializer = KeySerializer::with_capacity(8);
476 serializer.extend_i64(self);
477 serializer.to_encoded_key()
478 }
479}
480
481impl IntoEncodedKey for u32 {
482 fn into_encoded_key(self) -> EncodedKey {
483 let mut serializer = KeySerializer::with_capacity(4);
484 serializer.extend_u32(self);
485 serializer.to_encoded_key()
486 }
487}
488
489impl IntoEncodedKey for i32 {
490 fn into_encoded_key(self) -> EncodedKey {
491 let mut serializer = KeySerializer::with_capacity(4);
492 serializer.extend_i32(self);
493 serializer.to_encoded_key()
494 }
495}
496
497impl IntoEncodedKey for u16 {
498 fn into_encoded_key(self) -> EncodedKey {
499 let mut serializer = KeySerializer::with_capacity(2);
500 serializer.extend_u16(self);
501 serializer.to_encoded_key()
502 }
503}
504
505impl IntoEncodedKey for i16 {
506 fn into_encoded_key(self) -> EncodedKey {
507 let mut serializer = KeySerializer::with_capacity(2);
508 serializer.extend_i16(self);
509 serializer.to_encoded_key()
510 }
511}
512
513impl IntoEncodedKey for u8 {
514 fn into_encoded_key(self) -> EncodedKey {
515 let mut serializer = KeySerializer::with_capacity(1);
516 serializer.extend_u8(self);
517 serializer.to_encoded_key()
518 }
519}
520
521impl IntoEncodedKey for i8 {
522 fn into_encoded_key(self) -> EncodedKey {
523 let mut serializer = KeySerializer::with_capacity(1);
524 serializer.extend_i8(self);
525 serializer.to_encoded_key()
526 }
527}
528
529impl IntoEncodedKey for &u64 {
530 fn into_encoded_key(self) -> EncodedKey {
531 (*self).into_encoded_key()
532 }
533}
534
535impl IntoEncodedKey for &i64 {
536 fn into_encoded_key(self) -> EncodedKey {
537 (*self).into_encoded_key()
538 }
539}
540
541impl IntoEncodedKey for &u32 {
542 fn into_encoded_key(self) -> EncodedKey {
543 (*self).into_encoded_key()
544 }
545}
546
547impl IntoEncodedKey for &i32 {
548 fn into_encoded_key(self) -> EncodedKey {
549 (*self).into_encoded_key()
550 }
551}
552
553impl IntoEncodedKey for &u16 {
554 fn into_encoded_key(self) -> EncodedKey {
555 (*self).into_encoded_key()
556 }
557}
558
559impl IntoEncodedKey for &i16 {
560 fn into_encoded_key(self) -> EncodedKey {
561 (*self).into_encoded_key()
562 }
563}
564
565impl IntoEncodedKey for &u8 {
566 fn into_encoded_key(self) -> EncodedKey {
567 (*self).into_encoded_key()
568 }
569}
570
571impl IntoEncodedKey for &i8 {
572 fn into_encoded_key(self) -> EncodedKey {
573 (*self).into_encoded_key()
574 }
575}
576
577impl IntoEncodedKey for &Hash128 {
578 fn into_encoded_key(self) -> EncodedKey {
579 let mut serializer = KeySerializer::with_capacity(16);
580 serializer.extend_u128(self.0);
581 serializer.to_encoded_key()
582 }
583}
584
585impl IntoEncodedKey for RowNumber {
586 fn into_encoded_key(self) -> EncodedKey {
587 self.0.into_encoded_key()
588 }
589}
590
591impl IntoEncodedKey for &RowNumber {
592 fn into_encoded_key(self) -> EncodedKey {
593 self.0.into_encoded_key()
594 }
595}
596
597impl IntoEncodedKey for Value {
598 fn into_encoded_key(self) -> EncodedKey {
599 let mut serializer = KeySerializer::new();
600 serializer.extend_value(&self);
601 serializer.to_encoded_key()
602 }
603}
604
605impl IntoEncodedKey for &Value {
606 fn into_encoded_key(self) -> EncodedKey {
607 let mut serializer = KeySerializer::new();
608 serializer.extend_value(self);
609 serializer.to_encoded_key()
610 }
611}
612
613impl IntoEncodedKey for Vec<Value> {
614 fn into_encoded_key(self) -> EncodedKey {
615 let mut serializer = KeySerializer::new();
616 for value in self.iter() {
617 serializer.extend_value(value);
618 }
619 serializer.to_encoded_key()
620 }
621}
622
623impl IntoEncodedKey for &[Value] {
624 fn into_encoded_key(self) -> EncodedKey {
625 let mut serializer = KeySerializer::new();
626 for value in self.iter() {
627 serializer.extend_value(value);
628 }
629 serializer.to_encoded_key()
630 }
631}
632
633impl IntoEncodedKey for (String, String) {
634 fn into_encoded_key(self) -> EncodedKey {
635 let mut serializer = KeySerializer::new();
636 serializer.extend_str(&self.0);
637 serializer.extend_str(&self.1);
638 serializer.to_encoded_key()
639 }
640}
641
642impl IntoEncodedKey for &(String, String) {
643 fn into_encoded_key(self) -> EncodedKey {
644 let mut serializer = KeySerializer::new();
645 serializer.extend_str(&self.0);
646 serializer.extend_str(&self.1);
647 serializer.to_encoded_key()
648 }
649}
650
651impl IntoEncodedKey for (&str, &str) {
652 fn into_encoded_key(self) -> EncodedKey {
653 let mut serializer = KeySerializer::new();
654 serializer.extend_str(self.0);
655 serializer.extend_str(self.1);
656 serializer.to_encoded_key()
657 }
658}
659
660impl IntoEncodedKey for (Arc<str>, Arc<str>) {
661 fn into_encoded_key(self) -> EncodedKey {
662 let mut serializer = KeySerializer::new();
663 serializer.extend_str(&self.0);
664 serializer.extend_str(&self.1);
665 serializer.to_encoded_key()
666 }
667}
668
669impl IntoEncodedKey for &(Arc<str>, Arc<str>) {
670 fn into_encoded_key(self) -> EncodedKey {
671 let mut serializer = KeySerializer::new();
672 serializer.extend_str(&self.0);
673 serializer.extend_str(&self.1);
674 serializer.to_encoded_key()
675 }
676}
677
678impl IntoEncodedKey for (String, String, String) {
679 fn into_encoded_key(self) -> EncodedKey {
680 let mut serializer = KeySerializer::new();
681 serializer.extend_str(&self.0);
682 serializer.extend_str(&self.1);
683 serializer.extend_str(&self.2);
684 serializer.to_encoded_key()
685 }
686}
687
688impl IntoEncodedKey for &(String, String, String) {
689 fn into_encoded_key(self) -> EncodedKey {
690 let mut serializer = KeySerializer::new();
691 serializer.extend_str(&self.0);
692 serializer.extend_str(&self.1);
693 serializer.extend_str(&self.2);
694 serializer.to_encoded_key()
695 }
696}
697
698impl IntoEncodedKey for &String {
699 fn into_encoded_key(self) -> EncodedKey {
700 let mut serializer = KeySerializer::new();
701 serializer.extend_str(self);
702 serializer.to_encoded_key()
703 }
704}
705
706#[derive(Clone, Debug)]
707pub struct EncodedKeyRange {
708 pub start: Bound<EncodedKey>,
709 pub end: Bound<EncodedKey>,
710}
711
712impl EncodedKeyRange {
713 pub fn new(start: Bound<EncodedKey>, end: Bound<EncodedKey>) -> Self {
714 Self {
715 start,
716 end,
717 }
718 }
719
720 pub fn prefix(prefix: &[u8]) -> Self {
721 let start = Bound::Included(EncodedKey::new(prefix));
722 let end = match prefix.iter().rposition(|&b| b != 0xff) {
723 Some(i) => Bound::Excluded(EncodedKey::new(
724 prefix.iter().take(i).copied().chain(iter::once(prefix[i] + 1)).collect::<Vec<_>>(),
725 )),
726 None => Bound::Unbounded,
727 };
728 Self {
729 start,
730 end,
731 }
732 }
733
734 pub fn with_prefix(&self, prefix: EncodedKey) -> Self {
735 let start = match self.start_bound() {
736 Included(key) => {
737 let mut prefixed = EncodedKey::with_capacity(prefix.len() + key.len());
738 prefixed.extend_from_slice(prefix.as_ref());
739 prefixed.extend_from_slice(key.as_ref());
740 Included(prefixed)
741 }
742 Excluded(key) => {
743 let mut prefixed = EncodedKey::with_capacity(prefix.len() + key.len());
744 prefixed.extend_from_slice(prefix.as_ref());
745 prefixed.extend_from_slice(key.as_ref());
746 Excluded(prefixed)
747 }
748 Unbounded => Included(prefix.clone()),
749 };
750
751 let end = match self.end_bound() {
752 Included(key) => {
753 let mut prefixed = EncodedKey::with_capacity(prefix.len() + key.len());
754 prefixed.extend_from_slice(prefix.as_ref());
755 prefixed.extend_from_slice(key.as_ref());
756 Included(prefixed)
757 }
758 Excluded(key) => {
759 let mut prefixed = EncodedKey::with_capacity(prefix.len() + key.len());
760 prefixed.extend_from_slice(prefix.as_ref());
761 prefixed.extend_from_slice(key.as_ref());
762 Excluded(prefixed)
763 }
764 Unbounded => match prefix.as_ref().iter().rposition(|&b| b != 0xff) {
765 Some(i) => {
766 let mut next_prefix = prefix.as_ref()[..=i].to_vec();
767 next_prefix[i] += 1;
768 Excluded(EncodedKey::new(next_prefix))
769 }
770 None => Unbounded,
771 },
772 };
773
774 EncodedKeyRange::new(start, end)
775 }
776
777 pub fn start_end(start: Option<EncodedKey>, end: Option<EncodedKey>) -> Self {
778 let start = match start {
779 Some(s) => Bound::Included(s),
780 None => Bound::Unbounded,
781 };
782
783 let end = match end {
784 Some(e) => Bound::Included(e),
785 None => Bound::Unbounded,
786 };
787
788 Self {
789 start,
790 end,
791 }
792 }
793
794 pub fn all() -> Self {
795 Self {
796 start: Bound::Unbounded,
797 end: Bound::Unbounded,
798 }
799 }
800
801 pub fn parse(str: &str) -> Self {
802 let (mut start, mut end) = (Bound::<EncodedKey>::Unbounded, Bound::<EncodedKey>::Unbounded);
803
804 if let Some(dot_pos) = str.find("..") {
805 let start_part = &str[..dot_pos];
806 let end_part = &str[dot_pos + 2..];
807
808 if !start_part.is_empty() {
809 start = Bound::Included(EncodedKey::new(decode_binary(start_part)));
810 }
811
812 if let Some(end_str) = end_part.strip_prefix('=') {
813 if !end_str.is_empty() {
814 end = Bound::Included(EncodedKey::new(decode_binary(end_str)));
815 }
816 } else if !end_part.is_empty() {
817 end = Bound::Excluded(EncodedKey::new(decode_binary(end_part)));
818 }
819
820 Self {
821 start,
822 end,
823 }
824 } else {
825 Self {
826 start: Bound::Included(EncodedKey::new([0xff])),
827 end: Bound::Excluded(EncodedKey::new([0xff])),
828 }
829 }
830 }
831}
832
833impl RangeBounds<EncodedKey> for EncodedKeyRange {
834 fn start_bound(&self) -> Bound<&EncodedKey> {
835 self.start.as_ref()
836 }
837
838 fn end_bound(&self) -> Bound<&EncodedKey> {
839 self.end.as_ref()
840 }
841}
842
843#[cfg(test)]
844pub mod tests {
845 use std::collections::Bound;
846
847 use super::EncodedKey;
848
849 macro_rules! as_key {
850 ($key:expr) => {{ EncodedKey::new(keycode::serialize(&$key)) }};
851 }
852
853 mod prefix {
854 use std::ops::Bound;
855
856 use crate::key::encoded::{
857 EncodedKeyRange,
858 tests::{excluded, included},
859 };
860
861 #[test]
862 fn test_simple() {
863 let range = EncodedKeyRange::prefix(&[0x12, 0x34]);
864 assert_eq!(range.start, included(&[0x12, 0x34]));
865 assert_eq!(range.end, excluded(&[0x12, 0x35]));
866 }
867
868 #[test]
869 fn test_with_trailing_ff() {
870 let range = EncodedKeyRange::prefix(&[0x12, 0xff]);
871 assert_eq!(range.start, included(&[0x12, 0xff]));
872 assert_eq!(range.end, excluded(&[0x13]));
873 }
874
875 #[test]
876 fn test_with_multiple_trailing_ff() {
877 let range = EncodedKeyRange::prefix(&[0x12, 0xff, 0xff]);
878 assert_eq!(range.start, included(&[0x12, 0xff, 0xff]));
879 assert_eq!(range.end, excluded(&[0x13]));
880 }
881
882 #[test]
883 fn test_all_ff() {
884 let range = EncodedKeyRange::prefix(&[0xff, 0xff]);
885 assert_eq!(range.start, included(&[0xff, 0xff]));
886 assert_eq!(range.end, Bound::Unbounded);
887 }
888
889 #[test]
890 fn test_empty() {
891 let range = EncodedKeyRange::prefix(&[]);
892 assert_eq!(range.start, included(&[]));
893 assert_eq!(range.end, Bound::Unbounded);
894 }
895
896 #[test]
897 fn test_mid_increment() {
898 let range = EncodedKeyRange::prefix(&[0x12, 0x00, 0xff]);
899 assert_eq!(range.start, included(&[0x12, 0x00, 0xff]));
900 assert_eq!(range.end, excluded(&[0x12, 0x01]));
901 }
902 }
903
904 mod start_end {
905 use std::ops::Bound;
906
907 use crate::key::{
908 self as keycode,
909 encoded::{EncodedKey, EncodedKeyRange, tests::included},
910 };
911
912 #[test]
913 fn test_start_and_end() {
914 let range = EncodedKeyRange::start_end(Some(as_key!(1)), Some(as_key!(2)));
915 assert_eq!(range.start, included(&as_key!(1)));
916 assert_eq!(range.end, included(&as_key!(2)));
917 }
918
919 #[test]
920 fn test_start_only() {
921 let range = EncodedKeyRange::start_end(Some(as_key!(1)), None);
922 assert_eq!(range.start, included(&as_key!(1)));
923 assert_eq!(range.end, Bound::Unbounded);
924 }
925
926 #[test]
927 fn test_end_only() {
928 let range = EncodedKeyRange::start_end(None, Some(as_key!(2)));
929 assert_eq!(range.start, Bound::Unbounded);
930 assert_eq!(range.end, included(&as_key!(2)));
931 }
932
933 #[test]
934 fn test_unbounded_range() {
935 let range = EncodedKeyRange::start_end(None, None);
936 assert_eq!(range.start, Bound::Unbounded);
937 assert_eq!(range.end, Bound::Unbounded);
938 }
939
940 #[test]
941 fn test_full_byte_range() {
942 let range = EncodedKeyRange::start_end(Some(as_key!(0x00)), Some(as_key!(0xff)));
943 assert_eq!(range.start, included(&as_key!(0x00)));
944 assert_eq!(range.end, included(&as_key!(0xff)));
945 }
946
947 #[test]
948 fn test_identical_bounds() {
949 let range = EncodedKeyRange::start_end(Some(as_key!(0x42)), Some(as_key!(0x42)));
950 assert_eq!(range.start, included(&as_key!(0x42)));
951 assert_eq!(range.end, included(&as_key!(0x42)));
952 }
953 }
954
955 mod all {
956 use std::ops::Bound;
957
958 use crate::key::encoded::EncodedKeyRange;
959
960 #[test]
961 fn test_is_unbounded() {
962 let range = EncodedKeyRange::all();
963 assert_eq!(range.start, Bound::Unbounded);
964 assert_eq!(range.end, Bound::Unbounded);
965 }
966 }
967
968 mod parse {
969 use std::ops::Bound;
970
971 use crate::key::encoded::{
972 EncodedKey, EncodedKeyRange,
973 tests::{excluded, included},
974 };
975
976 #[test]
977 fn test_full_range() {
978 let r = EncodedKeyRange::parse("a..z");
979 assert_eq!(r.start, included(b"a"));
980 assert_eq!(r.end, excluded(b"z"));
981 }
982
983 #[test]
984 fn test_inclusive_end() {
985 let r = EncodedKeyRange::parse("a..=z");
986 assert_eq!(r.start, included(b"a"));
987 assert_eq!(r.end, included(b"z"));
988 }
989
990 #[test]
991 fn test_unbounded_start() {
992 let r = EncodedKeyRange::parse("..z");
993 assert_eq!(r.start, Bound::Unbounded);
994 assert_eq!(r.end, excluded(b"z"));
995 }
996
997 #[test]
998 fn test_unbounded_end() {
999 let r = EncodedKeyRange::parse("a..");
1000 assert_eq!(r.start, included(b"a"));
1001 assert_eq!(r.end, Bound::Unbounded);
1002 }
1003
1004 #[test]
1005 fn test_inclusive_only() {
1006 let r = EncodedKeyRange::parse("..=z");
1007 assert_eq!(r.start, Bound::Unbounded);
1008 assert_eq!(r.end, included(b"z"));
1009 }
1010
1011 #[test]
1012 fn test_invalid_string_returns_degenerate_range() {
1013 let r = EncodedKeyRange::parse("not a range");
1014 let expected = EncodedKey::new([0xff]);
1015 assert_eq!(r.start, Bound::Included(expected.clone()));
1016 assert_eq!(r.end, Bound::Excluded(expected));
1017 }
1018
1019 #[test]
1020 fn test_empty_string_returns_degenerate_range() {
1021 let r = EncodedKeyRange::parse("");
1022 let expected = EncodedKey::new([0xff]);
1023 assert_eq!(r.start, Bound::Included(expected.clone()));
1024 assert_eq!(r.end, Bound::Excluded(expected));
1025 }
1026
1027 #[test]
1028 fn test_binary_encoded_row() {
1029 let r = EncodedKeyRange::parse("0101..=0aff");
1030 assert_eq!(r.start, included(b"0101"));
1032 assert_eq!(r.end, included(b"0aff"));
1034 }
1035 }
1036
1037 fn included(key: &[u8]) -> Bound<EncodedKey> {
1038 Bound::Included(EncodedKey::new(key))
1039 }
1040
1041 fn excluded(key: &[u8]) -> Bound<EncodedKey> {
1042 Bound::Excluded(EncodedKey::new(key))
1043 }
1044}