noxu_bind/
record_number_binding.rs1use noxu_db::DatabaseEntry;
5
6use crate::entry_binding::EntryBinding;
7use crate::error::{BindError, Result};
8
9#[derive(Debug, Clone, Copy, Default)]
13pub struct RecordNumberBinding;
14
15impl RecordNumberBinding {
16 pub fn new() -> Self {
18 Self
19 }
20
21 pub fn entry_to_record_number(entry: &DatabaseEntry) -> Result<u64> {
23 let data = entry.data();
24 if data.len() < 8 {
25 return Err(BindError::BufferUnderflow {
26 needed: 8,
27 available: data.len(),
28 });
29 }
30 let mut bytes = [0u8; 8];
31 bytes.copy_from_slice(&data[..8]);
32 Ok(u64::from_be_bytes(bytes))
33 }
34
35 pub fn record_number_to_entry(number: u64, entry: &mut DatabaseEntry) {
37 entry.set_data(&number.to_be_bytes());
38 }
39}
40
41impl EntryBinding<u64> for RecordNumberBinding {
42 fn entry_to_object(&self, entry: &DatabaseEntry) -> Result<u64> {
43 Self::entry_to_record_number(entry)
44 }
45
46 fn object_to_entry(
47 &self,
48 object: &u64,
49 entry: &mut DatabaseEntry,
50 ) -> Result<()> {
51 Self::record_number_to_entry(*object, entry);
52 Ok(())
53 }
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[test]
61 fn test_round_trip() {
62 let binding = RecordNumberBinding::new();
63 let number = 12345u64;
64 let mut entry = DatabaseEntry::new();
65 binding.object_to_entry(&number, &mut entry).unwrap();
66 let result = binding.entry_to_object(&entry).unwrap();
67 assert_eq!(number, result);
68 }
69
70 #[test]
71 fn test_zero() {
72 let binding = RecordNumberBinding::new();
73 let mut entry = DatabaseEntry::new();
74 binding.object_to_entry(&0u64, &mut entry).unwrap();
75 assert_eq!(0u64, binding.entry_to_object(&entry).unwrap());
76 }
77
78 #[test]
79 fn test_max() {
80 let binding = RecordNumberBinding::new();
81 let mut entry = DatabaseEntry::new();
82 binding.object_to_entry(&u64::MAX, &mut entry).unwrap();
83 assert_eq!(u64::MAX, binding.entry_to_object(&entry).unwrap());
84 }
85
86 #[test]
87 fn test_underflow() {
88 let binding = RecordNumberBinding::new();
89 let entry = DatabaseEntry::from_bytes(&[1, 2, 3]);
90 let result = binding.entry_to_object(&entry);
91 assert!(result.is_err());
92 }
93}