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