sylvia_iot_broker/models/
cache_memory.rs

1//! Pure memory cache.
2
3use std::{error::Error as StdError, sync::Arc};
4
5use async_trait::async_trait;
6
7use super::{
8    device, device_route,
9    memory::{
10        device::{Cache as DeviceCache, Options as DeviceOptions},
11        device_route::{Cache as DeviceRouteCache, Options as DeviceRouteOptions},
12        network_route::{Cache as NetworkRouteCache, Options as NetworkRouteOptions},
13    },
14    network_route, Model,
15};
16
17/// Pure memory cache.
18#[derive(Clone)]
19pub struct Cache {
20    device: Arc<DeviceCache>,
21    device_route: Arc<DeviceRouteCache>,
22    network_route: Arc<NetworkRouteCache>,
23}
24
25pub struct Options<'a> {
26    pub device: &'a DeviceOptions,
27    pub device_route: &'a DeviceRouteOptions,
28    pub network_route: &'a NetworkRouteOptions,
29}
30
31impl Cache {
32    /// Create an instance.
33    pub fn new(opts: &Options, model: &Arc<dyn Model>) -> Self {
34        Cache {
35            device: Arc::new(DeviceCache::new(opts.device, model.clone())),
36            device_route: Arc::new(DeviceRouteCache::new(opts.device_route, model.clone())),
37            network_route: Arc::new(NetworkRouteCache::new(opts.network_route, model.clone())),
38        }
39    }
40}
41
42#[async_trait]
43impl super::Cache for Cache {
44    async fn close(&self) -> Result<(), Box<dyn StdError>> {
45        let _ = self.device_route().clear().await;
46        let _ = self.network_route().clear().await;
47        Ok(())
48    }
49
50    fn device(&self) -> &dyn device::DeviceCache {
51        self.device.as_ref()
52    }
53
54    fn device_route(&self) -> &dyn device_route::DeviceRouteCache {
55        self.device_route.as_ref()
56    }
57
58    fn network_route(&self) -> &dyn network_route::NetworkRouteCache {
59        self.network_route.as_ref()
60    }
61}