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}