mailtutan_lib/storage/
memory.rs

1use crate::models::Message;
2use crate::Storage;
3use std::collections::HashMap;
4
5#[derive(Default)]
6pub struct Memory {
7    sequence_id: usize,
8    messages_limit: usize,
9    records: HashMap<usize, Message>,
10}
11
12impl Memory {
13    pub fn new(capacity: usize) -> Self {
14        Self {
15            records: HashMap::new(),
16            sequence_id: 1,
17            messages_limit: capacity,
18        }
19    }
20}
21
22impl Storage for Memory {
23    fn list(&self) -> Vec<Message> {
24        let mut list: Vec<Message> = vec![];
25
26        for record in self.records.values() {
27            list.push(record.clone());
28        }
29
30        list
31    }
32
33    fn add(&mut self, mut message: Message) -> Message {
34        message.id = Some(self.sequence_id);
35
36        self.records.insert(self.sequence_id, message.clone());
37
38        if self.size() > self.messages_limit {
39            let record_to_delete = self.sequence_id - self.messages_limit;
40            self.remove(record_to_delete);
41        }
42
43        self.sequence_id += 1;
44
45        message
46    }
47
48    fn get(&self, item: usize) -> Message {
49        self.records.get(&item).unwrap().clone()
50    }
51
52    fn remove(&mut self, item: usize) {
53        self.records.remove(&item).unwrap();
54    }
55
56    fn size(&self) -> usize {
57        self.records.len()
58    }
59
60    fn delete_all(&mut self) {
61        self.records.clear()
62    }
63}