easyfix_session/
messages_storage.rs

1use std::{collections::BTreeMap, iter, ops::RangeInclusive};
2
3use easyfix_messages::fields::SeqNum;
4
5pub trait MessagesStorage {
6    fn fetch_range(&mut self, range: RangeInclusive<SeqNum>) -> impl Iterator<Item = &[u8]>;
7    fn store(&mut self, seq_num: SeqNum, data: &[u8]);
8
9    fn next_sender_msg_seq_num(&self) -> SeqNum;
10    fn next_target_msg_seq_num(&self) -> SeqNum;
11
12    fn set_next_sender_msg_seq_num(&mut self, seq_num: SeqNum);
13    fn set_next_target_msg_seq_num(&mut self, seq_num: SeqNum);
14
15    fn incr_next_sender_msg_seq_num(&mut self);
16    fn incr_next_target_msg_seq_num(&mut self);
17
18    fn reset(&mut self);
19}
20
21pub struct NullStorage {
22    next_sender_msg_seq_num: SeqNum,
23    next_target_msg_seq_num: SeqNum,
24}
25
26impl NullStorage {
27    pub fn new() -> NullStorage {
28        NullStorage {
29            next_sender_msg_seq_num: 1,
30            next_target_msg_seq_num: 1,
31        }
32    }
33}
34
35impl Default for NullStorage {
36    fn default() -> NullStorage {
37        NullStorage::new()
38    }
39}
40
41impl MessagesStorage for NullStorage {
42    // TODO: Stream? Returned iterator can be extremly big (and slow to create)
43    fn fetch_range(&mut self, _range: RangeInclusive<SeqNum>) -> impl Iterator<Item = &[u8]> {
44        iter::empty()
45    }
46
47    fn store(&mut self, _seq_num: SeqNum, _data: &[u8]) {}
48
49    fn next_sender_msg_seq_num(&self) -> SeqNum {
50        self.next_sender_msg_seq_num
51    }
52
53    fn next_target_msg_seq_num(&self) -> SeqNum {
54        self.next_target_msg_seq_num
55    }
56
57    fn set_next_sender_msg_seq_num(&mut self, seq_num: SeqNum) {
58        self.next_sender_msg_seq_num = seq_num;
59    }
60
61    fn set_next_target_msg_seq_num(&mut self, seq_num: SeqNum) {
62        self.next_target_msg_seq_num = seq_num;
63    }
64
65    fn incr_next_sender_msg_seq_num(&mut self) {
66        self.next_sender_msg_seq_num += 1;
67    }
68
69    fn incr_next_target_msg_seq_num(&mut self) {
70        self.next_target_msg_seq_num += 1;
71    }
72
73    fn reset(&mut self) {
74        self.next_sender_msg_seq_num = 1;
75        self.next_target_msg_seq_num = 1;
76    }
77}
78
79pub struct InMemoryStorage {
80    next_sender_msg_seq_num: SeqNum,
81    next_target_msg_seq_num: SeqNum,
82    messages: BTreeMap<SeqNum, Vec<u8>>,
83}
84
85impl InMemoryStorage {
86    pub fn new() -> InMemoryStorage {
87        InMemoryStorage {
88            next_sender_msg_seq_num: 1,
89            next_target_msg_seq_num: 1,
90            messages: BTreeMap::new(),
91        }
92    }
93}
94
95impl Default for InMemoryStorage {
96    fn default() -> InMemoryStorage {
97        InMemoryStorage::new()
98    }
99}
100
101impl MessagesStorage for InMemoryStorage {
102    // TODO: Stream!
103    fn fetch_range(&mut self, _range: RangeInclusive<SeqNum>) -> impl Iterator<Item = &[u8]> {
104        self.messages.values().map(|v| v.as_slice())
105    }
106
107    fn store(&mut self, seq_num: SeqNum, data: &[u8]) {
108        self.messages.insert(seq_num, data.to_vec());
109    }
110
111    fn next_sender_msg_seq_num(&self) -> SeqNum {
112        self.next_sender_msg_seq_num
113    }
114
115    fn next_target_msg_seq_num(&self) -> SeqNum {
116        self.next_target_msg_seq_num
117    }
118
119    fn set_next_sender_msg_seq_num(&mut self, seq_num: SeqNum) {
120        self.next_sender_msg_seq_num = seq_num;
121    }
122
123    fn set_next_target_msg_seq_num(&mut self, seq_num: SeqNum) {
124        self.next_target_msg_seq_num = seq_num;
125    }
126
127    fn incr_next_sender_msg_seq_num(&mut self) {
128        self.next_sender_msg_seq_num += 1;
129    }
130
131    fn incr_next_target_msg_seq_num(&mut self) {
132        self.next_target_msg_seq_num += 1;
133    }
134
135    fn reset(&mut self) {
136        self.next_sender_msg_seq_num = 1;
137        self.next_target_msg_seq_num = 1;
138        self.messages.clear();
139    }
140}