1use std::collections::VecDeque;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum Priority {
5 Low,
6 Normal,
7 Const,
8}
9
10#[derive(Debug)]
11pub struct Request {
12 pub seq: u64,
13 pub payload: serde_json::Value,
14 pub priority: Priority,
15}
16
17#[derive(Debug, Default)]
18pub struct RequestQueue {
19 seq: u64,
20 queue: VecDeque<Request>,
21}
22
23impl RequestQueue {
24 pub fn enqueue(&mut self, mut payload: serde_json::Value, priority: Priority) -> u64 {
25 let seq = self.next_seq();
26 assign_seq(&mut payload, seq);
27 let request = Request {
28 seq,
29 payload,
30 priority,
31 };
32
33 match priority {
34 Priority::Const => self.queue.push_front(request),
35 Priority::Low => self.queue.push_back(request),
36 Priority::Normal => {
37 let idx = self
38 .queue
39 .iter()
40 .rposition(|req| matches!(req.priority, Priority::Const))
41 .map(|pos| pos + 1)
42 .unwrap_or(0);
43 self.queue.insert(idx, request);
44 }
45 }
46
47 seq
48 }
49
50 pub fn dequeue(&mut self) -> Option<Request> {
51 self.queue.pop_front()
52 }
53
54 pub fn reset(&mut self) {
55 self.seq = 0;
56 self.queue.clear();
57 }
58
59 fn next_seq(&mut self) -> u64 {
60 let seq = self.seq;
61 self.seq += 1;
62 seq
63 }
64
65 pub fn is_empty(&self) -> bool {
66 self.queue.is_empty()
67 }
68}
69
70fn assign_seq(payload: &mut serde_json::Value, seq: u64) {
71 if let Some(obj) = payload.as_object_mut() {
72 obj.insert("seq".to_string(), serde_json::json!(seq));
73 }
74}