ts_bridge/rpc/
queue.rs

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}