terminal-chat
111 строк · 2.6 Кб
1use std::{collections::{HashMap, VecDeque}, iter};
2
3#[derive(Debug, Clone)]
4pub struct PoolMessage {
5pub id: String,
6pub username: String,
7pub message: String,
8pub from_server: bool,
9}
10
11impl PoolMessage {
12fn new() -> PoolMessage {
13PoolMessage {
14id: String::new(),
15username: String::new(),
16message: String::new(),
17from_server: false,
18}
19}
20}
21
22pub struct MessagesPool {
23pool: VecDeque<PoolMessage>,
24indexes: HashMap<String, u8>,
25length: u16,
26}
27
28impl MessagesPool {
29pub fn new() -> MessagesPool {
30let arr: VecDeque<PoolMessage> = iter::repeat_with(|| PoolMessage::new())
31.take(256)
32.collect();
33MessagesPool {
34pool: arr,
35indexes: HashMap::new(),
36length: 0
37}
38}
39
40pub fn push(&mut self, v: PoolMessage) {
41if self.length == 256 {
42self.pool.pop_front();
43self.pool.push_back(v);
44
45let mut new_indexes: HashMap<String, u8> = HashMap::new();
46for (index, message) in self.pool.iter().enumerate() {
47new_indexes.insert(message.id.clone(), index as u8);
48}
49self.indexes = new_indexes;
50}
51else {
52let index = self.length as u8;
53self.pool[index as usize] = v.clone();
54self.length += 1;
55self.indexes.insert(v.id.clone(), index);
56}
57}
58
59fn read_from(&self, id: &str) -> (Vec<PoolMessage>, Option<String>) {
60let found_index = self.indexes.get(id);
61match found_index {
62Some(v) => {
63let index: u16 = v.to_owned() as u16 + 1;
64let sliced_pool = &Vec::from(self.pool.clone())[index.into()..self.length.into()];
65let sliced_pool_last = {
66if sliced_pool.len() == 0 {
67None
68}
69else {
70Some(sliced_pool.last().unwrap().clone().id)
71}
72};
73return (sliced_pool.clone().into(), sliced_pool_last)
74},
75None => {
76let last_el = self.last();
77let index = match last_el {
78Some(v) => Some(v.id.clone()),
79None => None
80};
81let sliced_pool = &Vec::from(self.pool.clone())[..self.length.into()];
82return (sliced_pool.into(), index)
83}
84}
85}
86
87pub fn has_new(&self, id: &str) -> Option<(Vec<PoolMessage>, Option<String>)> {
88let last_el = self.last();
89match last_el {
90Some(_) => Some(self.read_from(id)),
91None => None,
92}
93}
94
95fn last(&self) -> Option<PoolMessage> {
96let last_index = {
97if self.length > 0 {
98self.length - 1
99} else {
100self.length
101}
102};
103
104let last_el = &self.pool[last_index.into()];
105if last_el.id == "".to_owned() {
106None
107} else {
108Some(last_el.to_owned())
109}
110}
111}