foundry_wallets/wallet_browser/
queue.rs1use std::collections::{HashMap, VecDeque};
2
3use uuid::Uuid;
4
5use crate::wallet_browser::types::{BrowserSignRequest, BrowserTransactionRequest};
6
7#[derive(Debug)]
8pub(crate) struct RequestQueue<Req, Res> {
9 requests: VecDeque<Req>,
11 responses: HashMap<Uuid, Res>,
13}
14
15impl<Req, Res> Default for RequestQueue<Req, Res> {
16 fn default() -> Self {
17 Self::new()
18 }
19}
20
21impl<Req, Res> RequestQueue<Req, Res> {
22 pub fn new() -> Self {
24 Self { requests: VecDeque::new(), responses: HashMap::new() }
25 }
26
27 pub fn add_request(&mut self, request: Req) {
29 self.requests.push_back(request);
30 }
31
32 pub fn has_request(&self, id: &Uuid) -> bool
34 where
35 Req: HasId,
36 {
37 self.requests.iter().any(|r| r.id() == id)
38 }
39
40 pub fn read_request(&self) -> Option<&Req> {
42 self.requests.front()
43 }
44
45 pub fn remove_request(&mut self, id: &Uuid) -> Option<Req>
47 where
48 Req: HasId,
49 {
50 if let Some(pos) = self.requests.iter().position(|r| r.id() == id) {
51 self.requests.remove(pos)
52 } else {
53 None
54 }
55 }
56
57 pub fn add_response(&mut self, id: Uuid, response: Res) {
59 self.responses.insert(id, response);
60 }
61
62 pub fn get_response(&mut self, id: &Uuid) -> Option<Res> {
64 self.responses.remove(id)
65 }
66}
67
68pub(crate) trait HasId {
69 fn id(&self) -> &Uuid;
70}
71
72impl HasId for BrowserTransactionRequest {
73 fn id(&self) -> &Uuid {
74 &self.id
75 }
76}
77
78impl HasId for BrowserSignRequest {
79 fn id(&self) -> &Uuid {
80 &self.id
81 }
82}