Skip to main content

reifydb_codec/key/
encoded.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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			// decode_binary("0101") = [0x01, 0x01]
1031			assert_eq!(r.start, included(b"0101"));
1032			// decode_binary("0aff") = [0x0a, 0xff]
1033			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}