1use std::collections::BTreeSet;
2
3use dashmap::DashMap;
4use parking_lot::RwLock;
5
6pub struct DisclaimerCache {
7 agree_api: RwLock<Option<bool>>,
8 broker_agreements: DashMap<u32, bool>,
9}
10
11impl DisclaimerCache {
12 pub fn new() -> Self {
13 Self {
14 agree_api: RwLock::new(None),
15 broker_agreements: DashMap::new(),
16 }
17 }
18
19 #[must_use]
20 pub fn agree_api(&self) -> Option<bool> {
21 *self.agree_api.read()
22 }
23
24 pub fn set_agree_api(&self, agreed: bool) {
25 *self.agree_api.write() = Some(agreed);
26 }
27
28 #[must_use]
29 pub fn broker_agreement(&self, broker_id: u32) -> Option<bool> {
30 self.broker_agreements
31 .get(&broker_id)
32 .map(|entry| *entry.value())
33 }
34
35 pub fn set_broker_agreement(&self, broker_id: u32, agreed: bool) {
36 self.broker_agreements.insert(broker_id, agreed);
37 }
38
39 #[must_use]
40 pub fn unagreed_brokers(&self, brokers: impl IntoIterator<Item = u32>) -> Vec<u32> {
41 brokers
42 .into_iter()
43 .collect::<BTreeSet<_>>()
44 .into_iter()
45 .filter(|broker_id| self.broker_agreement(*broker_id) != Some(true))
46 .collect()
47 }
48}
49
50impl Default for DisclaimerCache {
51 fn default() -> Self {
52 Self::new()
53 }
54}