Skip to main content

noxu_bind/
record_number_binding.rs

1//! Record number binding.
2//!
3
4use noxu_db::DatabaseEntry;
5
6use crate::entry_binding::EntryBinding;
7use crate::error::{BindError, Result};
8
9/// A binding for u64 record numbers stored as big-endian 8-byte arrays.
10///
11///
12#[derive(Debug, Clone, Copy, Default)]
13pub struct RecordNumberBinding;
14
15impl RecordNumberBinding {
16    /// Creates a new `RecordNumberBinding`.
17    pub fn new() -> Self {
18        Self
19    }
20
21    /// Converts a `DatabaseEntry` to a record number (u64).
22    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    /// Converts a record number (u64) to a `DatabaseEntry`.
36    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}