foundry_wallets/wallet_browser/
queue.rs

1use 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    /// Pending requests from CLI to browser
10    requests: VecDeque<Req>,
11    /// Responses from browser indexed by request ID
12    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    /// Create a new request queue.
23    pub fn new() -> Self {
24        Self { requests: VecDeque::new(), responses: HashMap::new() }
25    }
26
27    /// Add a new request to the queue.
28    pub fn add_request(&mut self, request: Req) {
29        self.requests.push_back(request);
30    }
31
32    /// Check if the queue contains any pending requests matching the given ID.
33    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    /// Read the next request from the queue without removing it.
41    pub fn read_request(&self) -> Option<&Req> {
42        self.requests.front()
43    }
44
45    /// Remove a request by its ID.
46    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    /// Add a response to the queue.
58    pub fn add_response(&mut self, id: Uuid, response: Res) {
59        self.responses.insert(id, response);
60    }
61
62    /// Get a response by its ID, removing it from the queue.
63    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}