Skip to main content

futu_cache/
disclaimer.rs

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}