easyfix_session/
messages_storage.rs1use 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 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 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}