epoch_db/metadata/
mod.rs

1//! The `metadata` module defines the `Metadata` struct and its associated
2//! methods. `Metadata` is used to track information about each key-value
3//! pair, such as its creation time, access frequency, and TTL.
4
5use std::time::{
6    SystemTime,
7    UNIX_EPOCH
8};
9
10use bincode::error::{
11    DecodeError,
12    EncodeError
13};
14use bincode::serde::{
15    decode_from_slice,
16    encode_to_vec
17};
18
19use crate::Metadata;
20
21impl Metadata {
22    /// Creates a new `Metadata` instance with an optional TTL.
23    ///
24    /// The `created_at` timestamp is set to the current system time.
25    pub fn new(ttl: Option<u64>) -> Metadata {
26        let currtime = SystemTime::now()
27            .duration_since(UNIX_EPOCH)
28            .expect("Cant get the current time")
29            .as_secs();
30        Metadata {
31            freq: 0,
32            created_at: currtime,
33            ttl
34        }
35    }
36
37    /// Increments the frequency counter.
38    pub fn freq_incretement(mut self) -> Metadata {
39        self.freq += 1;
40        self
41    }
42
43    /// Decrements the frequency counter.
44    pub fn freq_decretement(mut self) -> Metadata {
45        self.freq -= 1;
46        self
47    }
48
49    /// Serializes the `Metadata` instance into a byte vector using `bincode`.
50    ///
51    /// # Errors
52    ///
53    /// Returns an `EncodeError` if serialization fails.
54    pub fn to_u8(&self) -> Result<Vec<u8>, EncodeError> {
55        encode_to_vec(self, bincode::config::standard())
56    }
57
58    /// Deserializes a `Metadata` instance from a byte slice using `bincode`.
59    ///
60    /// # Errors
61    ///
62    /// Returns a `DecodeError` if deserialization fails.
63    pub fn from_u8(slice: &[u8]) -> Result<Metadata, DecodeError> {
64        Ok(decode_from_slice(slice, bincode::config::standard())?.0)
65    }
66}