sylvia_iot_broker/models/
cache_memory.rs1use 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#[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 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}